Lecture8: Hashing I
字典
一种抽象数据类型(Abstract Data Type ,ADT),维护一组元素,每个元素都与一个关键字(KEY)相关,并有以下操作:
实现
直接寻址表(Direct Access Table):用KEY为数据下标保存元素。
问题:
key必须是非负整数。
key的范围不能太大。
解决方法:
散列表(hashing):
怎么处理碰撞(collision)?
连接法:
把散列到同一槽中的所有元素都放在一个链表中。
执行性能:O(1 + α)。
python代码:
class hashTableItem(object):
def __init__(self):
self.key = None
self.Next = None
self.val = None
class hash_table_chaining(object):
def __init__(self,nHashSize):
self.__KeyList = []
self.__nHashSize = nHashSize
for i in range(nHashSize):
self.__KeyList.append(hashTableItem())
return
def __HashFun(self,key):
return key % self.__nHashSize
def insert(self,key,val):
tmpNode = self.__KeyList[self.__HashFun(key)]
while( ( tmpNode.key is not None ) and ( 'deleted' != tmpNode.key ) ):
tmpNode = tmpNode.Next
tmpNode.key = key
tmpNode.val = val
tmpNode.Next = hashTableItem()
return
def search(self,key):
tmpNode = self.__KeyList[self.__HashFun(key)]
while( tmpNode.key is not None ):
if key == tmpNode.key :
return tmpNode.val
tmpNode = tmpNode.Next
return None
def delete(self,key):
tmpNode = self.__KeyList[self.__HashFun(key)]
while( tmpNode.key is not None ):
if key == tmpNode.key :
tmpNode.key = 'deleted'
return True
tmpNode = tmpNode.Next
return False
散列函数(Hash Functions)
除法散列法(Division Method): h(k) = k mod m
乘法散列法(Multiplication Method):
全域散列法(Universal Hashing):