MIT Introduction to Algorithms 学习笔记(九)

Lecture8: Hashing I

字典

一种抽象数据类型(Abstract Data Type ADT),维护一组元素,每个元素都与一个关键字(KEY)相关,并有以下操作:

152451_gmOc_106593.jpg

实现

直接寻址表(Direct Access Table):用KEY为数据下标保存元素。

154540_zkXZ_106593.png

问题:

  1. key必须是非负整数。

  2. key的范围不能太大。

 

解决方法:

散列表(hashing):

154607_ZJuQ_106593.png

 

154626_wVAE_106593.png

 

怎么处理碰撞(collision)?

连接法:

把散列到同一槽中的所有元素都放在一个链表中。

154725_4daP_106593.png

执行性能: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

155304_GJVm_106593.png

乘法散列法(Multiplication Method)

155334_YQrp_106593.png

 

全域散列法(Universal Hashing):

155437_WaZa_106593.png

 

 

 

转载于:https://my.oschina.net/hyaicc/blog/601391

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值