alex0sunny

hash_table

Sep 18th, 2021 (edited)
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.96 KB | None | 0 0
  1. M = 100003
  2.  
  3.  
  4. class Node:
  5.     def __init__(self, uid, v, next_item=None):
  6.         self.value = [uid, v]
  7.         self.next_item = next_item
  8.  
  9.  
  10. class Chain:
  11.  
  12.     head = None
  13.  
  14.     def __search_prev_cur__(self, uid):
  15.         if not self.head:
  16.             return None, None
  17.         if self.head.value[0] == uid:
  18.             return None, self.head
  19.         node = self.head
  20.         while node.next_item and node.next_item.value[0] != uid:
  21.             node = node.next_item
  22.         if node.next_item and node.next_item.value[0] == uid:
  23.             return node, node.next_item
  24.         return None, None
  25.  
  26.     def put(self, uid, v):
  27.         _, node = self.__search_prev_cur__(uid)
  28.         if node:
  29.             node.value[1] = v
  30.         else:
  31.             node = Node(uid, v, next_item=self.head)
  32.             self.head = node
  33.  
  34.     def get(self, uid):
  35.         _, node = self.__search_prev_cur__(uid)
  36.         return node.value[1] if node else False
  37.  
  38.     def delete(self, uid):
  39.         prev, node = self.__search_prev_cur__(uid)
  40.         if not node:
  41.             return False
  42.         ret = node.value[1]
  43.         if not prev:
  44.             self.head = node.next_item
  45.         else:
  46.             prev.next_item = node.next_item
  47.         return ret
  48.  
  49.  
  50. def process_commands(n):
  51.     get_bucket = lambda uid: uid % M
  52.     hash_table = [None for _ in range(M)]
  53.     for _ in range(n):
  54.         args = (input() + ' 0').split()[:3]
  55.         cmd = args[0]
  56.         uid = int(args[1])
  57.         v = int(args[2])
  58.         bucket = get_bucket(uid)
  59.         chain = hash_table[bucket]
  60.         if not chain:
  61.             chain = Chain()
  62.         res = {'put': lambda k, v: chain.put(uid, v),
  63.                'get': lambda k, v: chain.get(uid),
  64.                'delete': lambda k, v: chain.delete(uid)}[cmd](uid, v)
  65.         hash_table[bucket] = chain if chain.head else None
  66.         [0 if res is None else print(None) if res is False else print(res)]
  67.  
  68.  
  69. n = int(input())
  70. process_commands(n)
  71.  
Add Comment
Please, Sign In to add comment