# ç¨Pythonå®ç°hash表 # hashçæ¥æ¾æä½æ¶é´å¤æåº¦O(1) # hashæ¯ä¸ªä½ç½®è¢«ç§°ä¸ºslotæ§½ãå¯ä»¥ä½¿ç¨listå®ç°hash,æ¯ä¸ªslot对åºä¸ä¸ªkey,åæ¾å ç´ # æç §æ£å¸¸ç忝å¨ASCIIä¸ç顺åºmod tablesizeæé hash def hash(astring, tablesize): sum = 0 for pos in astring: sum = sum + ord(pos) return sum%tablesize print(hash('cat', 11)) # catå¨hashä¸çä½ç½®,hash tableé¿åº¦11 # æ¹è¿hash, 让æ¯ä¸ä½ç忝ä¹ä»¥è¯¥åæ¯å¨å串ä¸çä½ç½®ç¶åmod def hash2(astring, tablesize): sum = 0 for pos in range(len(astring)): sum += (pos+1) * ord(astring[pos]) return sum%tablesize print(hash2('cat', 11)) # å²çªè§£å³:å离é¾--å²çªä½ç½®ææä¸ä¸ªé¾; linear probingåçå²çªå»ä¸ä¸ä¸ªä½ç½® class HashTable: def __init__(self): self.size = 11 self.slots = [None] * self.size self.data = [None] * self.size def put(self, key, data): hashvalue = self.hashfunction(key, self.size) if self.slots[hashvalue] == None: self.slots[hashvalue] = key self.data[hashvalue] = data else: if self.slots[hashvalue] == key: self.data[hashvalue] = data # æ¿æ¢ç¸åç´¢å¼å¯¹åºçé¡¹ç® else: if None not in self.slots and key not in self.slots: # 夿hashæ¯å¦å·²ç»æ»¡äº, å¿ é¡»æ·»å key not in self.slots, å¦åä¿®æ¹å·²æhashå¼ä¼ç´æ¥è¿å-1 print('sorry, there is not enough slots for you!') return -1 nextslot = self.rehash(hashvalue, len(self.slots)) while self.slots[nextslot] != None and self.slots[nextslot] != key: nextslot = self.rehash(nextslot, len(self.slots)) if self.slots[nextslot] == None: self.slots[nextslot] = key self.data[nextslot] = data else: self.data[nextslot] = data def hashfunction(self, key, size): return key%size def rehash(self, oldhash, size): return (oldhash+1)%size def get(self, key): startslot = self.hashfunction(key, len(self.slots)) data = None stop = False found = False position = startslot while self.slots[position] != None and not found and not stop: if self.slots[position] == key: found = True data = self.data[position] else: position = self.rehash(position, len(self.slots)) if position == startslot: stop = True return data def __getitem__(self, key): return self.get(key) def __setitem__(self, key, data): self.put(key, data) H = HashTable() H[54] = 'cat' H[26] = "dog" H[93] = "lion" H[17] = "tiger" H[77] = "bird" H[31] = "cow" H[44] = "goat" H[55] = "pig" H[20] = "chicken" print(H[20]) print(H.slots) print(H.data) print(H[99]) H[21] = "elephant" H[22] = "sheep" H[23] = "fish" print(H.data) H[20] = 'monkey' print(H.data)