PHP前端开发

详解拉链法实现字典的示例

百变鹏仔 3小时前 #Python
文章标签 示例

字典:

也叫散列表,最大的特点是通过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查到的时间,可见下图