数据结构与算法(python):映射抽象数据类型 ADT Map

参考自 MOOC数据结构与算法Python版

一、ADT Map的定义

1.1 字典

字典”是一种可以保存key-data键值对的数据类型,其中关键码key可用于查询关联的数据值data,这种键值关联的方法称为“映射Map
ADT Map的结构是键-值关联的无序集合。关键码具有唯一性,通过关键码可以唯一确定一个数据值。

1.2 ADT Map定义的操作

函数含义
Map()创建一个空映射,返回空映射对象
put(key, val)将key-val关联对加入映射中,如果key已存在,将val替换旧关联值
get(key)给定key,返回关联的数据值,如不存在,则返回None
del通过del map[key]的语句形式删除keyval关联
len()返回映射中key-val关联的数目
in通过key in map的语句形式,返回key是否存在于关联中,布尔值

二、ADT Map的代码实现

为了达到快速查找的目标, 需要一个支持高效查找的ADT实现,可以采用列表数据结构加顺序查找或者二分查找。当然,更为合适的是使用前述的散列表来实现,这样查找可以达到最快O(1)的性能。
下面, 我们用一个HashTable类来实现ADT Map, 该类包含了两个列表作为成员:

  • 一个slot列表用于保存key,作为散列表,散列表的大小,应该选择为素数
  • 一个data列表用于保存数据项,在slot列表查找到一个key的位置以后,在data列表对应相同位置的数据项即为关联数据。

hashfunction方法采用了简单求余方法来实现散列函数, 而冲突解决则采用线性探测加1”再散列函数
【代码】:

def hashfuction(self, key):
    return key %self.size

def rehash(self, oldhash):
    return (oldhash + 1) % self.size

def put(self, key, data):
    hashvalue = self.hashfunction(key)
    if self.slots[hashvalue] == None: #key不存在未冲突
        self.slots[hashvalue] = key
        self.data[hashvalue] = data
    else: #key已存在,替换val
        if self.slots[hashvalue] == key:
            self.data[hashvalue] = data  #replace
        else:
            nextslot = self.rehash(hashvalue)
            #散列冲突,再散列,直到找到空槽或者key
            while self.slots[nextslot] != None and self.slots[nextslot] != key:
                nextslot = self.rehash(nextslot)
            if self.slots[nextslot] == None:
                self.slots[nextslot] = key
                self.data[nextslot] = data
            else:
                self.data[nextslot] = data
                
def get(self,key):
    startslot = self.hashfunction(key) #标记散列值为查找起点
    data = None
    stop = False
    found = False
    position = startslot
    #找key,直到空槽或回到起点
    while self.slots[position] != None and not found and not stop:
        if self.slots[position] == key:
            found = True
            data = self.data[position]
        else:
            #未找到key,再散列继续找
            position = self.rehash(position)
            if position == startslot:
                stop = True
        return data
    
def __getitem__(self,key):
    return self.get(key)

def __setitem__(self,key,data):
    self.put(key,data)

散列在最好的情况下, 可以提供 O ( 1 ) O(1) O(1)常数级时间复杂度的查找性能.

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值