Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2017
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.73 KB | None | 0 0
  1. # Copyright 2013, Michael H. Goldwasser
  2. #
  3. # Developed for use with the book:
  4. #
  5. #    Data Structures and Algorithms in Python
  6. #    Michael T. Goodrich, Roberto Tamassia, and Michael H. Goldwasser
  7. #    John Wiley & Sons, 2013
  8. #
  9. # This program is free software: you can redistribute it and/or modify
  10. # it under the terms of the GNU General Public License as published by
  11. # the Free Software Foundation, either version 3 of the License, or
  12. # (at your option) any later version.
  13. #
  14. # This program is distributed in the hope that it will be useful,
  15. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17. # GNU General Public License for more details.
  18. #
  19. # You should have received a copy of the GNU General Public License
  20. # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  21.  
  22. from Rivisitazione.MapBaseForSTM import MapBase
  23.  
  24.  
  25. class SortedTableMap(MapBase):
  26.     """Map implementation using a sorted table."""
  27.  
  28.     # ----------------------------- nonpublic behaviors -----------------------------
  29.     def _find_index(self, k, low, high):
  30.         """Return index of the leftmost item with key greater than or equal to k.
  31.        Return high + 1 if no such item qualifies.
  32.        That is, j will be returned such that:
  33.           all items of slice table[low:j] have key < k
  34.           all items of slice table[j:high+1] have key >= k
  35.        """
  36.         if high < low:
  37.             return high + 1  # no element qualifies
  38.         else:
  39.             mid = (low + high) // 2
  40.             if k == self._table[mid]._key:
  41.                 return mid  # found exact match
  42.             elif k < self._table[mid]._key:
  43.                 return self._find_index(k, low, mid - 1)  # Note: may return mid
  44.             else:
  45.                 return self._find_index(k, mid + 1, high)  # answer is right of mid
  46.  
  47.     # ----------------------------- public behaviors -----------------------------
  48.     def __init__(self):
  49.         """Create an empty map."""
  50.         self._table = []
  51.  
  52.     def __len__(self):
  53.         """Return number of items in the map."""
  54.         return len(self._table)
  55.  
  56.     def __getitem__(self, k):
  57.         """Return value associated with key k (raise KeyError if not found)."""
  58.         j = self._find_index(k, 0, len(self._table) - 1)
  59.         if j == len(self._table) or self._table[j]._key != k:
  60.             raise KeyError('Key Error: ' + repr(k))
  61.         return self._table[j]._value
  62.  
  63.     def getEffective(self , k):
  64.         j = self._find_index(k, 0, len(self._table) - 1)
  65.         if j == len(self._table) or self._table[j]._key != k:
  66.             return None
  67.         return self._table[j]._effective
  68.  
  69.  
  70.     def __setitem__(self, k, v):
  71.         """Assign value v to key k, overwriting existing value if present."""
  72.         j = self._find_index(k, 0, len(self._table) - 1)
  73.         if j < len(self._table) and self._table[j]._key == k:
  74.             self._table[j]._value = v  # reassign value
  75.         else:
  76.             self._table.insert(j, self._Item(k, v))  # adds new item
  77.  
  78.     def setEffective(self , k , e):
  79.         j = self._find_index(k, 0, len(self._table) - 1)
  80.         if j < len(self._table) and self._table[j]._key == k:
  81.             self._table[j]._effective = e  # reassign value
  82.         else:
  83.             raise ('Key '+ repr(k) + ' is not set') # adds new item
  84.  
  85.  
  86.     def __delitem__(self, k):
  87.         """Remove item associated with key k (raise KeyError if not found)."""
  88.         j = self._find_index(k, 0, len(self._table) - 1)
  89.         if j == len(self._table) or self._table[j]._key != k:
  90.             raise KeyError('Key Error: ' + repr(k))
  91.         self._table.pop(j)  # delete item
  92.  
  93.     def __iter__(self):
  94.         """Generate keys of the map ordered from minimum to maximum."""
  95.         for item in self._table:
  96.             yield item._key
  97.  
  98.     def __reversed__(self):
  99.         """Generate keys of the map ordered from maximum to minimum."""
  100.         for item in reversed(self._table):
  101.             yield item._key
  102.  
  103.     def find_min(self):
  104.         """Return (key,value) pair with minimum key (or None if empty)."""
  105.         if len(self._table) > 0:
  106.             return (self._table[0]._key, self._table[0]._value)
  107.         else:
  108.             return None
  109.  
  110.     def find_max(self):
  111.         """Return (key,value) pair with maximum key (or None if empty)."""
  112.         if len(self._table) > 0:
  113.             return (self._table[-1]._key, self._table[-1]._value)
  114.         else:
  115.             return None
  116.  
  117.     def find_le(self, k):
  118.         """Return (key,value) pair with greatest key less than or equal to k.
  119.        Return None if there does not exist such a key.
  120.        """
  121.         j = self._find_index(k, 0, len(self._table) - 1)  # j's key >= k
  122.         if j < len(self._table) and self._table[j]._key == k:
  123.             return (self._table[j]._key, self._table[j]._value)  # exact match
  124.         elif j > 0:
  125.             return (self._table[j - 1]._key, self._table[j - 1]._value)  # Note use of j-1
  126.         else:
  127.             return None
  128.  
  129.     def find_ge(self, k):
  130.         """Return (key,value) pair with least key greater than or equal to k.
  131.        Return None if there does not exist such a key.
  132.        """
  133.         j = self._find_index(k, 0, len(self._table) - 1)  # j's key >= k
  134.         if j < len(self._table):
  135.             return (self._table[j]._key, self._table[j]._value)
  136.         else:
  137.             return None
  138.  
  139.     def find_lt(self, k):
  140.         """Return (key,value) pair with greatest key strictly less than k.
  141.        Return None if there does not exist such a key.
  142.        """
  143.         j = self._find_index(k, 0, len(self._table) - 1)  # j's key >= k
  144.         if j > 0:
  145.             return (self._table[j - 1]._key, self._table[j - 1]._value)  # Note use of j-1
  146.         else:
  147.             return None
  148.  
  149.     def find_gt(self, k):
  150.         """Return (key,value) pair with least key strictly greater than k.
  151.        Return None if there does not exist such a key.
  152.        """
  153.         j = self._find_index(k, 0, len(self._table) - 1)  # j's key >= k
  154.         if j < len(self._table) and self._table[j]._key == k:
  155.             j += 1  # advanced past match
  156.         if j < len(self._table):
  157.             return (self._table[j]._key, self._table[j]._value)
  158.         else:
  159.             return None
  160.  
  161.     def find_range(self, start, stop):
  162.         """Iterate all (key,value) pairs such that start <= key < stop.
  163.        If start is None, iteration begins with minimum key of map.
  164.        If stop is None, iteration continues through the maximum key of map.
  165.        """
  166.         if start is None:
  167.             j = 0
  168.         else:
  169.             j = self._find_index(start, 0, len(self._table) - 1)  # find first result
  170.         while j < len(self._table) and (stop is None or self._table[j]._key < stop):
  171.             yield (self._table[j]._key, self._table[j]._value)
  172.             j += 1
  173.  
  174.     #aggiunti
  175.  
  176.     def get_by_index(self , i):
  177.         return self._table[i]
  178.  
  179.     def _iter_value(self):
  180.         for item in self._table:
  181.             yield item._value
  182.  
  183.     def value(self):
  184.         for e in self._table:
  185.             yield e._value
  186.  
  187.     def subElement(self, start, stop):
  188.  
  189.         subS = SortedTableMap()
  190.  
  191.         for i in range(start, stop):
  192.             item = self.get_by_index(i)
  193.             subS[item._key] = item._value
  194.             subS.setEffective(item._key, item.effective())
  195.  
  196.         return subS
  197.  
  198.     def changeKey(self,k,k2,e):
  199.  
  200.         j = self._find_index(k, 0, len(self._table) - 1)
  201.         if j == len(self._table) or self._table[j]._key != k:
  202.             raise KeyError('Key Error: ' + repr(k))
  203.  
  204.         v = self._table[j]._value
  205.         self.__setitem__(k2,v)
  206.         self.setEffective(k2,e)
  207.         self.__delitem__(k)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement