发布网友 发布时间:2022-05-10 09:04
共3个回答
懂视网 时间:2022-05-10 13:25
字典:也叫散列表,最大的特点是通过key来查找其对应的值其时间复杂度是O(1).
在Python中怎样用列表实现字典?
用列表实现字典最大的问题就是解决hash冲突,如果在列表中通过计算不同的key得到相同的相同了位置,这时候应该怎么办?
最简单的办法就是使用拉链法.
拉链法:就是在一个列表中每个位置再添加一个列表,这样就算是有hash冲突也能够存储进去,当选取的hash函数足够好,
num的数足够大,就能够保证列表中的每一个列表里面只有一个元素。根据key计算的元素所在的位置,然后来取值就能达
到O(1)的时间。
class MyDict: def __init__(self, num=100): # 指定列表大小 self._num = num self._lst = [] for _ in range(self._num): self._lst.append([]) def update(self, key, value): # 添加 key-value key_index = hash(key) % self._num for i, (k, v) in enumerate(self._lst[key_index]): if key == k: self._lst[key_index][i] = [key, value] break else: self._lst[key_index].append([key, value]) def get(self, key): # 根据指定的 key 弹出值 key_index = hash(key) % self._num for k, v in self._lst[key_index]: if k == key: return v else: raise KeyError('No such {} key'.format(key)) def pop(self, key): # 根据 key 弹出元素 并且删除 key_index = hash(key) % self._num for i, (k, v) in enumerate(self._lst[key_index]): if k == key: result = v self._lst.pop[self._num](i) return result else: raise KeyError('No such {} key'.format(key)) def __getitem__(self, key): # 可以通过下标来取值 key_index = hash(key) % self._num for k, v in self._lst[key_index]: if k == key: return v else: raise KeyError('No such {} key'.format(key)) def keys(self): # 取得所有的key for index in range(self._num): for k, v in self._lst[index]: yield k def values(self): # 取得所有的 value for index in range(self._num): for k, v in self._lst[index]: yield v def items(self): # 取得所有的条目 for index in range(self._num): for item in self._lst[index]: yield item
通过key查到的时间,可见下图
热心网友 时间:2022-05-10 10:33
楼主要求用C,麻烦呢,如果用C++倒是方便多了,闲着没事做,简单写了下,看下就好
追问Σ( ° △ °|||)︴ 太...太厉害,只是窝一弱渣,看不懂C++...
能麻烦说说使用什么结构么?是顺序查找字典么?
追答用的其实就是map字典,我把学生的生日(月和日)作为一个查找键,找不到,就插入新的,找到了,就更新该键对应下面的学生信息
至于为什么要弄一个nCount来保存个数,方便你说的要求选中三个以上什么的而已,呵呵~
热心网友 时间:2022-05-10 11:51
字典是一种固定索引方式。对应的C++里的数据结构是map,两个或者两个以上键值对中选择一个作为索引表,通过索引获得对应的其它键值。就是把数组的数字索引换成了数据的某个键值,不过索引键值要求是唯一的。