Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.28 KB | None | 0 0
  1.  
  2. from Rivisitazione.LinkedMwTree import LinkedMwTree
  3. from Rivisitazione.Tdp_collections.map.map_base import MapBase
  4. from Rivisitazione.sorted_table_map import SortedTableMap
  5.  
  6. class TwoDTreeMap(LinkedMwTree,MapBase):
  7.  
  8.     # --------------- nonpublic utilities -------------------------------
  9.     def __init__(self,d=4):
  10.  
  11.         super().__init__()
  12.         if d >3 and d<9:
  13.           self._d=d
  14.         else:
  15.             raise Exception("Errore non compreso tra 2 e 9 esclusi")
  16.  
  17.  
  18.     def _subtree_search(self , p , k):
  19.         """Return Position of p's subtree having key k, or last node searched."""
  20.  
  21.         self._validate(p)
  22.  
  23.         if p.element().getEffective(k) is not None:
  24.             return p
  25.  
  26.         if not self.is_leaf(p):
  27.  
  28.             child = p.element().find_gt(k)
  29.  
  30.             if(child == None): #ultimo
  31.                 return self._subtree_search(self._make_position(p.get_last()),k)
  32.             else:
  33.                 return self._subtree_search(self._make_position(child[1]),k)
  34.         else:
  35.             return p
  36.  
  37.  
  38.     def _subtree_first_position(self, p):
  39.  
  40.         self._validate(p)
  41.         walk = p
  42.  
  43.         while not self.is_leaf(walk):
  44.             walk = self._make_position(walk.element().find_min()[1])
  45.         return walk
  46.  
  47.     def _subtree_last_position(self, p):
  48.  
  49.         self._validate(p)
  50.         walk = p
  51.  
  52.         while not self.is_leaf(walk):
  53.             walk = self._make_position(walk._node._last)
  54.         return walk
  55.  
  56.  
  57.     # --------------------- public methods providing "positional" support ---------------------
  58.  
  59.     def first(self):
  60.         return self._subtree_first_position(self.root()) if len(self) > 0 else None
  61.  
  62.     def last(self):
  63.         return self._subtree_last_position(self.root()) if len(self) > 0 else None
  64.  
  65.     def sibling(self, p):
  66.  
  67.         self._validate(p)
  68.         s = self.left_brother(p) if self.left_brother(p) != None else self.right_brother(p) if self.right_brother(
  69.             p) != None else None
  70.  
  71.     def before(self , p):
  72.         pass
  73.  
  74.     def after(self , p):
  75.         pass
  76.  
  77.     def find_position(self,k):
  78.  
  79.         if self.is_empty():
  80.             return None
  81.         else:
  82.             p= self._subtree_search(self.root(),k)
  83.             return p
  84.  
  85.     def delete(self, p):
  86.         pass
  87.  
  88.     # --------------------- public methods for (standard) map interface ---------------------
  89.  
  90.     def __getitem__(self, k):
  91.  
  92.         if self.is_empty():
  93.             raise KeyError('Errore chiave non trovata poichè albero vuoto : ' + repr(k))
  94.         else:
  95.             p = self._subtree_search(self.root(),k)
  96.  
  97.  
  98.             if p.element().getEffective(k) is not None:
  99.                 return p.element().getEffective(k)
  100.             else:
  101.                 raise KeyError('Key Error: ' + repr(k))
  102.  
  103.     def __setitem__(self, key, value):
  104.  
  105.         if self.is_empty():
  106.             element = SortedTableMap()
  107.             element[key]=None
  108.             element.setEffective(key,value)
  109.             self._add_root(element)
  110.  
  111.         else:
  112.             p = self._subtree_search(self.root(), key)
  113.             if(p.element().get(key)!=None):
  114.                 p.element().setEffective(key,value)
  115.             else:
  116.                 overflow = self._check_overflow(p)
  117.                 if overflow == True:
  118.                     p = self._subtree_search(self.root(), key)
  119.                 p.element()[key]=None
  120.                 p.element().setEffective(key, value)
  121.             p._node._size_elem += 1
  122.             self._size += 1
  123.  
  124.     def __delitem__(self, key):
  125.         if self.is_empty():
  126.             raise KeyError('Errore chiave non trovata poichè albero vuoto : ' + repr(key))
  127.         else:
  128.             p = self._subtree_search(self.root(), key)
  129.  
  130.         print("p : "+str(p))
  131.  
  132.         if(not self.is_leaf(p)): #se non sono foglia
  133.             p = self._swap_with_pre(p,key)
  134.  
  135.         if self._check_underflow(p):
  136.             pass
  137.  
  138.         del p._node._elements[key]
  139.  
  140.  
  141.     #--------------------- private method for __setitem__ --------------------------------------
  142.  
  143.     def _check_overflow(self, p):
  144.  
  145.         if p.get_size() == self._d - 1:
  146.             if p._node == self._root:
  147.                 self._make_new_root()
  148.                 return True
  149.             else:
  150.                 self._check_overflow(self.parent(p))
  151.                 self._split(p)
  152.             return True
  153.         else:
  154.             return False
  155.  
  156.     def _make_new_root(self):
  157.  
  158.         p = self.root()
  159.         leaf = self.is_leaf(p)
  160.         pivot = round((p.get_size() - 0.1) / 2)
  161.         item_promote = p.element().get_by_index(pivot)
  162.         n1_elem=p.element().subElement(0,pivot)
  163.         n2_elem=p.element().subElement(pivot+1,len(p.element()))
  164.         n1_last = item_promote._value
  165.         n2_last = p.get_last()
  166.  
  167.         n1_node = self._Node(n1_elem,None,n1_last)
  168.         n2_node = self._Node(n2_elem,None,n2_last)
  169.  
  170.  
  171.         elem_promote = SortedTableMap()
  172.         elem_promote[item_promote._key] = n1_node  # qui va n1
  173.         elem_promote.setEffective(item_promote._key,item_promote.effective())
  174.  
  175.         self._root._elements = elem_promote
  176.         self._root._last = n2_node
  177.         self._root._size_elem = 1
  178.  
  179.         #settiamo i parent
  180.         n1_node._parent = self._root
  181.         n2_node._parent = self._root
  182.  
  183.         if not leaf:
  184.             for c in n1_node._elements.value():
  185.                 c._parent = n1_node
  186.             n1_node._last._parent = n1_node
  187.  
  188.             for c in n2_node._elements.value():
  189.                 c._parent = n2_node
  190.             n2_node._last._parent = n2_node
  191.  
  192.     def _split(self,p):
  193.  
  194.         leaf = self.is_leaf(p)
  195.         pivot = round((p.get_size() - 0.1) / 2)
  196.  
  197.         item_promote = p.element().get_by_index(pivot)
  198.         n1_elem = p.element().subElement(0, pivot)
  199.         n2_elem = p.element().subElement(pivot + 1, len(p.element()))
  200.         parent = self.parent(p)
  201.         n1_node = self._Node(n1_elem, parent._node, item_promote._value)
  202.  
  203.         parent.element()[item_promote._key] = n1_node
  204.         parent.element().setEffective(item_promote._key, item_promote._effective)
  205.  
  206.         p._node._elements = n2_elem
  207.         p._node._size_elem = len(n2_elem)
  208.  
  209.         if not leaf:
  210.             for c in p._node.element().value():
  211.                 c._parent = p._node
  212.  
  213.         if not leaf:
  214.             for c in n1_node._elements.value():
  215.                 c._parent = n1_node
  216.             n1_node._last._parent = n1_node
  217.  
  218.         parent._node._size_elem += 1
  219.  
  220.     # --------------------- private method for __delitem__ --------------------------------------
  221.  
  222.     def _swap_with_pre(self , p , k):
  223.  
  224.         self._validate(p)
  225.         son = self._make_position(p.element().get(k))
  226.         pre=self._subtree_last_position(son)
  227.         kC = pre.element().find_max()[0]
  228.  
  229.         p._node._elements.changeKey(k,kC,pre._node._elements.getEffective(kC))
  230.         pre._node._elements.changeKey(kC,k,p._node._elements.getEffective(k))
  231.  
  232.         return pre
  233.  
  234.     def _check_underflow(self, p):
  235.         if p.get_size() != 1:
  236.             return False
  237.         else:
  238.             True
  239.  
  240.  
  241.     def _move_elem(self):
  242.         pass #da implementare forse dopo
  243.  
  244.     def _delete_pos(self, p):
  245.  
  246.         pass
  247.  
  248.     def _swap_elem(self, ind1, p1, ind2, p2):
  249.  
  250.         pass
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement