Purposelessness

Untitled

Dec 24th, 2022
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.30 KB | None | 0 0
  1. def hash1(s: str, table_size):
  2.     h = 0
  3.     for c in s:
  4.         h += (h * 5171 + ord(c)) % table_size
  5.     h = (h * 2 - 1) % table_size
  6.     return h
  7.  
  8.  
  9. def hash2(s: str, table_size):
  10.     h = 0
  11.     for c in s:
  12.         h += (h * 5179 + ord(c)) % table_size
  13.     h = (h * 2 - 1) % table_size
  14.     return h
  15.  
  16.  
  17. class Node:
  18.     def __init__(self, key=0, value=0):
  19.         self.key = key
  20.         self.value = value
  21.         self.enabled = True
  22.  
  23.  
  24. class HashTable:
  25.     def __init__(self, size=8):
  26.         print("Происходит инициализация хеш таблицы.")
  27.         self.table_size = size
  28.         self.slots: list[Node] = [None] * self.table_size  # что это значит
  29.         self.size = 0
  30.         self.koef = 2 / 3
  31.  
  32.     def change_size(self):
  33.         print("Значение размера таблицы до: ", self.table_size)
  34.         self.table_size *= 2
  35.         self.size = 0
  36.         old_table = self.slots
  37.         self.slots: list[Node] = [None] * self.table_size
  38.         for el in old_table:
  39.             if el is not None and el.enabled:
  40.                 self.insert(el.key, el.value)
  41.         print(f"Значение размера таблицы после: {self.table_size}\n")
  42.         return self.table_size
  43.  
  44.     def insert(self, key, value):
  45.         if self.size / self.table_size >= self.koef:
  46.             self.change_size()
  47.         h1 = hash1(key, self.table_size)
  48.         h2 = hash2(key, self.table_size)
  49.         node = self.slots[h1]
  50.         while True:
  51.             if node is None or not node.enabled:
  52.                 self.slots[h1] = Node(key, value)
  53.                 self.size += 1
  54.                 return
  55.             elif node.key == key:
  56.                 self.slots[h1] = Node(key, value)
  57.                 return
  58.             h1 += h2
  59.             h1 %= self.table_size
  60.             node = self.slots[h1]
  61.  
  62.     def search(self, key):
  63.         h1 = hash1(key, self.table_size)
  64.         h2 = hash2(key, self.table_size)
  65.         node = self.slots[h1]
  66.         while True:
  67.             if node is None:
  68.                 return False
  69.             elif node.enabled and node.key == key:
  70.                 return True
  71.             h1 += h2
  72.             h1 %= self.table_size
  73.             node = self.slots[h1]
  74.  
  75.     def remove(self, key):
  76.         h1 = hash1(key, self.table_size)
  77.         h2 = hash2(key, self.table_size)
  78.         node = self.slots[h1]
  79.         while True:
  80.             if node is None:
  81.                 return False
  82.             elif node.enabled and node.key == key:
  83.                 node.enabled = False
  84.                 self.size -= 1
  85.                 return True
  86.             h1 += h2
  87.             h1 %= self.table_size
  88.             node = self.slots[h1]
  89.  
  90.     def print(self):
  91.         print(f"Table size: {self.table_size}, Size: {self.size}")
  92.         arr: list[str] = []
  93.         for el in self.slots:
  94.             if el is not None:
  95.                 arr.append(f"{el.key} : {el.value} : {el.enabled}")
  96.         print(arr)
  97.  
  98.  
  99. if __name__ == '__main__':
  100.     data: list[str] = []
  101.     with open("test.txt", 'r') as f:
  102.         s = f.readline().rstrip()
  103.         while s != '':
  104.             data.append(s)
  105.             s = f.readline().rstrip()
  106.     table = HashTable()
  107.  
  108.     print(data)
  109.     for s in data:
  110.         table.insert(s, s)
  111.     table.print()
  112.  
Add Comment
Please, Sign In to add comment