Purposelessness

Untitled

Dec 24th, 2022
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.89 KB | None | 0 0
  1. def h1_func(key, table_size):
  2.     res = 0
  3.     for i in range(len(key)):
  4.         res += (ord(key[-i - 1]) * (19 ** i)) % table_size
  5.     return res % table_size
  6.  
  7.  
  8. class Node:
  9.     def __init__(self, key, data, next_element=None):
  10.         self.key = key
  11.         self.data = data
  12.         self.next_element: Node = next_element
  13.  
  14.  
  15. class Chain:
  16.     def __init__(self, size=8):
  17.         self.fill_factor = 0.7
  18.         self.table_size = size  # Размер таблицы
  19.         self.bucket_size = 0    # Количество головных узлов
  20.         self.size = 0           # Количество элементов
  21.         self.slots: list[Node] = [None] * self.table_size
  22.         self.insert_iterations = []
  23.         self.search_iterations = []
  24.         self.remove_iterations = []
  25.  
  26.     def resize(self):
  27.         self.table_size *= 2
  28.         self.size = 0
  29.         self.bucket_size = 0
  30.         self.slots, old_slots = [None] * self.table_size, self.slots
  31.         for i in old_slots:
  32.             while i is not None:
  33.                 self.insert(i.key, i.data)
  34.                 i = i.next_element
  35.  
  36.     def insert(self, key, data):
  37.         if (self.size + 1) > self.fill_factor * self.table_size:
  38.             self.resize()
  39.         h = h1_func(key, self.table_size)
  40.         cell: Node = self.slots[h]
  41.         node = Node(key, data)
  42.         i = 1
  43.         if cell is None:
  44.             self.size += 1
  45.             self.bucket_size += 1
  46.             self.slots[h] = node
  47.             self.insert_iterations.append(i)
  48.             return
  49.         while cell is not None:
  50.             if cell.key == key:
  51.                 self.insert_iterations.append(i)
  52.                 return
  53.             if cell.next_element is None:
  54.                 break
  55.             cell = cell.next_element
  56.             i += 1
  57.         cell.next_element = node
  58.         self.size += 1
  59.         self.insert_iterations.append(i)
  60.  
  61.     def search(self, key):
  62.         result = None
  63.         h = h1_func(key, self.table_size)
  64.         cell = self.slots[h]
  65.         i = 1
  66.         if not cell:
  67.             self.search_iterations.append(i)
  68.             return result
  69.         while cell:
  70.             if cell.key == key:
  71.                 result = cell.data
  72.                 break
  73.             cell = cell.next_element
  74.             i += 1
  75.         self.search_iterations.append(i)
  76.         return result
  77.  
  78.     def delete(self, key):
  79.         h = h1_func(key, self.table_size)
  80.         cell: Node = self.slots[h]
  81.         i = 1
  82.         if cell is None:
  83.             self.remove_iterations.append(i)
  84.             return
  85.         if cell.key == key:
  86.             if cell.next_element is None:
  87.                 self.bucket_size -= 1
  88.             self.size -= 1
  89.             self.slots[h] = cell.next_element
  90.             self.remove_iterations.append(i)
  91.             return
  92.         while cell.next_element is not None:
  93.             if cell.next_element.key == key:
  94.                 self.size -= 1
  95.                 cell.next_element = cell.next_element.next_element
  96.                 self.remove_iterations.append(i)
  97.                 return
  98.             i += 1
  99.             cell = cell.next_element
  100.         self.remove_iterations.append(i)
  101.         return
  102.  
  103.     def print(self):
  104.         out: list[list[str]] = []
  105.         for el in self.slots:
  106.             arr: list[str] = []
  107.             while el is not None:
  108.                 arr.append(f"{el.key} : {el.data}")
  109.                 el = el.next_element
  110.             out.append(arr)
  111.         print(f"Table size: {self.table_size}, Size: {self.size}, Bucket size: {self.bucket_size}")
  112.         print(out)
  113.  
  114.  
  115. if __name__ == '__main__':
  116.     data: list[str] = []
  117.     with open("test.txt", 'r') as f:
  118.         s = f.readline().rstrip()
  119.         while s != '':
  120.             data.append(s)
  121.             s = f.readline().rstrip()
  122.     chain = Chain()
  123.  
  124.     print(data)
  125.     for s in data:
  126.         chain.insert(s, s)
  127.     chain.print()
  128.  
Add Comment
Please, Sign In to add comment