Advertisement
frolkin28

Hash tables

Apr 20th, 2020
492
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.64 KB | None | 0 0
  1. from time import time
  2.  
  3.  
  4. class Node:
  5.     def __init__(self, key, value):
  6.         self.key = key
  7.         self.value = value
  8.         self.next = None
  9.  
  10.     def __str__(self):
  11.         return "<Node: (%s, %s), next: %s>" % (self.key, self.value, self.next != None)
  12.  
  13.     def __repr__(self):
  14.         return str(self)
  15.  
  16.  
  17. class HashTable:
  18.     def __init__(self, initial_capacity):
  19.         self.capacity = initial_capacity
  20.         self.size = 0
  21.         self.buckets = [None] * self.capacity
  22.  
  23.     def hash(self, key):
  24.         hashsum = 0
  25.         for idx, c in enumerate(key):
  26.             hashsum += (idx + len(key)) ** ord(c)
  27.             hashsum = hashsum % self.capacity
  28.         return hashsum
  29.  
  30.     def insert(self, key, value,):
  31.         self.size += 1
  32.         index = self.hash(key)
  33.         node = self.buckets[index]
  34.         if node is None:
  35.             self.buckets[index] = Node(key, value,)
  36.             return
  37.         prev = node
  38.         while node is not None:
  39.             prev = node
  40.             node = node.next
  41.         prev.next = Node(key, value,)
  42.  
  43.     def find(self, key):
  44.         index = self.hash(key)
  45.         node = self.buckets[index]
  46.         while node is not None and node.key != key:
  47.             node = node.next
  48.         if node is None:
  49.             print("Не знайдено")
  50.             return None
  51.         else:
  52.             return node.key, node.value,
  53.  
  54.     def remove(self, key):
  55.         index = self.hash(key)
  56.         node = self.buckets[index]
  57.         prev = None
  58.         while node is not None and node.key != key:
  59.             prev = node
  60.             node = node.next
  61.         if node is None:
  62.             return None
  63.         else:
  64.             self.size -= 1
  65.             result = node.value
  66.             if prev is None:
  67.                 self.buckets[index] = node.next
  68.             else:
  69.                 prev.next = prev.next.next
  70.             return result
  71.  
  72.  
  73. class BTreeNode:
  74.     def __init__(self, leaf=False):
  75.         self.leaf = leaf
  76.         self.keys = []
  77.         self.child = []
  78.  
  79.  
  80. class BTree:
  81.     def __init__(self, t):
  82.         self.root = BTreeNode(True)
  83.         self.t = t
  84.  
  85.     def search(self, k, x=None):
  86.         if x is not None:
  87.             i = 0
  88.             while i < len(x.keys) and k > x.keys[i][0]:
  89.                 i += 1
  90.             if i < len(x.keys) and k == x.keys[i][0]:
  91.                 return (x, i)
  92.             elif x.leaf:
  93.                 return None
  94.             else:
  95.                 return self.search(k, x.child[i])
  96.         else:
  97.             return self.search(k, self.root)
  98.  
  99.     def printTree(self, x, l=0):
  100.         print("Level ", l, " ", len(x.keys), end=":")
  101.         for i in x.keys:
  102.             print(i, end=" ")
  103.         print()
  104.         l += 1
  105.         if len(x.child) > 0:
  106.             for i in x.child:
  107.                 self.printTree(i, l)
  108.  
  109.     def insert(self, k):
  110.         root = self.root
  111.         if len(root.keys) == (2 * self.t) - 1:
  112.             temp = BTreeNode()
  113.             self.root = temp
  114.             temp.child.insert(0, root)
  115.             self.splitChild(temp, 0)
  116.             self.insertNonFull(temp, k)
  117.         else:
  118.             self.insertNonFull(root, k)
  119.  
  120.     def insertNonFull(self, x, k):
  121.         i = len(x.keys) - 1
  122.         if x.leaf:
  123.             x.keys.append((None, None))
  124.             while i >= 0 and k[0] < x.keys[i][0]:
  125.                 x.keys[i + 1] = x.keys[i]
  126.                 i -= 1
  127.             x.keys[i + 1] = k
  128.         else:
  129.             while i >= 0 and k[0] < x.keys[i][0]:
  130.                 i -= 1
  131.             i += 1
  132.             if len(x.child[i].keys) == (2 * self.t) - 1:
  133.                 self.splitChild(x, i)
  134.                 if k[0] > x.keys[i][0]:
  135.                     i += 1
  136.             self.insertNonFull(x.child[i], k)
  137.  
  138.     def splitChild(self, x, i):
  139.         t = self.t
  140.         y = x.child[i]
  141.         z = BTreeNode(y.leaf)
  142.         x.child.insert(i + 1, z)
  143.         x.keys.insert(i, y.keys[t - 1])
  144.         z.keys = y.keys[t: (2 * t) - 1]
  145.         y.keys = y.keys[0: t - 1]
  146.         if not y.leaf:
  147.             z.child = y.child[t: 2 * t]
  148.             y.child = y.child[0: t - 1]
  149.  
  150.     def delete(self, x, k):
  151.         t = self.t
  152.         i = 0
  153.         while i < len(x.keys) and k[0] > x.keys[i][0]:
  154.             i += 1
  155.         if x.leaf:
  156.             if i < len(x.keys) and x.keys[i][0] == k[0]:
  157.                 x.keys.pop(i)
  158.                 return
  159.             return
  160.         if i < len(x.keys) and x.keys[i][0] == k[0]:
  161.             return self.deleteInternalNode(x, k, i)
  162.         elif len(x.child[i].keys) >= t:
  163.             self.delete(x.child[i], k)
  164.         else:
  165.             if i != 0 and i + 2 < len(x.child):
  166.                 if len(x.child[i - 1].keys) >= t:
  167.                     self.deleteSibling(x, i, i - 1)
  168.                 elif len(x.child[i + 1].keys) >= t:
  169.                     self.deleteSibling(x, i, i + 1)
  170.                 else:
  171.                     self.deleteMerge(x, i, i + 1)
  172.             elif i == 0:
  173.                 if len(x.child[i + 1].keys) >= t:
  174.                     self.deleteSibling(x, i, i + 1)
  175.                 else:
  176.                     self.deleteMerge(x, i, i + 1)
  177.             elif i + 1 == len(x.child):
  178.                 if len(x.child[i - 1].keys) >= t:
  179.                     self.deleteSibling(x, i, i - 1)
  180.                 else:
  181.                     self.deleteMerge(x, i, i - 1)
  182.             self.delete(x.child[i], k)
  183.  
  184.     def deleteInternalNode(self, x, k, i):
  185.         t = self.t
  186.         if x.leaf:
  187.             if x.keys[i][0] == k[0]:
  188.                 x.keys.pop(i)
  189.                 return
  190.             return
  191.         if len(x.child[i].keys) >= t:
  192.             x.keys[i] = self.deletePredecessor(x.child[i])
  193.             return
  194.         elif len(x.child[i + 1].keys) >= t:
  195.             x.keys[i] = self.deleteSuccessor(x.child[i + 1])
  196.             return
  197.         else:
  198.             self.deleteMerge(x, i, i + 1)
  199.             self.deleteInternalNode(x.child[i], k, self.t - 1)
  200.  
  201.     def deletePredecessor(self, x):
  202.         if x.leaf:
  203.             return x.pop()
  204.         n = len(x.keys) - 1
  205.         if len(x.child[n].keys) >= self.t:
  206.             self.deleteSibling(x, n + 1, n)
  207.         else:
  208.             self.deleteMerge(x, n, n + 1)
  209.         self.deletePredecessor(x.child[n])
  210.  
  211.     def deleteSuccessor(self, x):
  212.         if x.leaf:
  213.             return x.keys.pop(0)
  214.         if len(x.child[1].keys) >= self.t:
  215.             self.deleteSibling(x, 0, 1)
  216.         else:
  217.             self.deleteMerge(x, 0, 1)
  218.             self.deleteSuccessor(x.child[0])
  219.  
  220.     def deleteMerge(self, x, i, j):
  221.         cnode = x.child[i]
  222.         if j > i:
  223.             rsnode = x.child[j]
  224.             cnode.keys.append(x.keys[i])
  225.             for k in range(len(rsnode.keys)):
  226.                 cnode.keys.append(rsnode.keys[k])
  227.                 if len(rsnode.child) > 0:
  228.                     cnode.child.append(rsnode.child[k])
  229.             if len(rsnode.child) > 0:
  230.                 cnode.child.append(rsnode.child.pop())
  231.             new = cnode
  232.             x.keys.pop(i)
  233.             x.child.pop(j)
  234.         else:
  235.             lsnode = x.child[j]
  236.             lsnode.keys.append(x.keys[j])
  237.             for i in range(len(cnode.keys)):
  238.                 lsnode.keys.append(cnode.keys[i])
  239.                 if len(lsnode.child) > 0:
  240.                     lsnode.child.append(cnode.child[i])
  241.             if len(lsnode.child) > 0:
  242.                 lsnode.child.append(cnode.child.pop())
  243.             new = lsnode
  244.             x.keys.pop(j)
  245.             x.child.pop(i)
  246.         if x == self.root and len(x.keys) == 0:
  247.             self.root = new
  248.  
  249.     def deleteSibling(self, x, i, j):
  250.         cnode = x.child[i]
  251.         if i < j:
  252.             rsnode = x.child[j]
  253.             cnode.keys.append(x.keys[i])
  254.             x.keys[i] = rsnode.keys[0]
  255.             if len(rsnode.child) > 0:
  256.                 cnode.child.append(rsnode.child[0])
  257.                 rsnode.child.pop(0)
  258.             rsnode.keys.pop(0)
  259.         else:
  260.             lsnode = x.child[j]
  261.             cnode.keys.insert(0, x.keys[i - 1])
  262.             x.keys[i - 1] = lsnode.keys.pop()
  263.             if len(lsnode.child) > 0:
  264.                 cnode.child.insert(0, lsnode.child.pop())
  265. def main():
  266.     test = HashTable(50)
  267.     n = int(input("Уведіть розмір\n"))
  268.     start = time()
  269.     for i in range(0, n):
  270.         test.insert("Name " + str(i),("City " + str(i),i))
  271.     end = time()
  272.     for k in range(0,n):
  273.         print(test.find("Name " + str(k)))
  274.     print("Час заповнення елементами: {}".format(end-start))
  275.     a = int(input("З якого елемента починаєм пошук\n"))
  276.     b = int(input("З якого елемента закінчуєм пошук\n"))
  277.     start = time()
  278.     for k in range(a, b):
  279.         print(test.find(str(k)))
  280.     end = time()
  281.     print("Час знаходження елементів:{}".format(end - start))
  282.     print("----------------------------------------------")
  283.     print('B tree з послідовними елементами')
  284.     B1 = BTree(100)
  285.     start = time()
  286.     for i in range(0, n):
  287.         B1.insert((i, 2 * i))
  288.     end = time()
  289.     B1.printTree(B1.root)
  290.     print('Час заповнення елементами: {}'.format(end - start))
  291.     a1 = int(input("З якого елемента починаєм пошук\n"))
  292.     b1 = int(input("З якого елемента закінчуєм пошук\n"))
  293.     start = time()
  294.     for k in range(a1,b1):
  295.         if B1.search(k) is None:
  296.             print("Не знайдено")
  297.         else:
  298.             print("Знайдено")
  299.     end = time()
  300.     print('Час пошуку:{}'.format(end - start))
  301.  
  302.  
  303. if __name__ == "__main__":
  304.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement