当前位置:Gxlcms > Python > 详解拉链法实现字典的示例

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

时间:2021-07-01 10:21:17 帮助过:83人阅读

字典:

也叫散列表,最大的特点是通过key来查找其对应的值其时间复杂度是O(1).

在Python中怎样用列表实现字典?

用列表实现字典最大的问题就是解决hash冲突,如果在列表中通过计算不同的key得到相同的相同了位置,这时候应该怎么办?

最简单的办法就是使用拉链法.

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

拉链法:就是在一个列表中每个位置再添加一个列表,这样就算是有hash冲突也能够存储进去,当选取的hash函数足够好,

num的数足够大,就能够保证列表中的每一个列表里面只有一个元素。根据key计算的元素所在的位置,然后来取值就能达

到O(1)的时间。

  1. class MyDict:
  2. def __init__(self, num=100): # 指定列表大小
  3. self._num = num
  4. self._lst = []
  5. for _ in range(self._num):
  6. self._lst.append([])
  7. def update(self, key, value): # 添加 key-value
  8. key_index = hash(key) % self._num
  9. for i, (k, v) in enumerate(self._lst[key_index]):
  10. if key == k:
  11. self._lst[key_index][i] = [key, value]
  12. break
  13. else:
  14. self._lst[key_index].append([key, value])
  15. def get(self, key): # 根据指定的 key 弹出值
  16. key_index = hash(key) % self._num
  17. for k, v in self._lst[key_index]:
  18. if k == key:
  19. return v
  20. else:
  21. raise KeyError('No such {} key'.format(key))
  22. def pop(self, key): # 根据 key 弹出元素 并且删除
  23. key_index = hash(key) % self._num
  24. for i, (k, v) in enumerate(self._lst[key_index]):
  25. if k == key:
  26. result = v
  27. self._lst.pop[self._num](i)
  28. return result
  29. else:
  30. raise KeyError('No such {} key'.format(key))
  31. def __getitem__(self, key): # 可以通过下标来取值
  32. key_index = hash(key) % self._num
  33. for k, v in self._lst[key_index]:
  34. if k == key:
  35. return v
  36. else:
  37. raise KeyError('No such {} key'.format(key))
  38. def keys(self): # 取得所有的key
  39. for index in range(self._num):
  40. for k, v in self._lst[index]:
  41. yield k
  42. def values(self): # 取得所有的 value
  43. for index in range(self._num):
  44. for k, v in self._lst[index]:
  45. yield v
  46. def items(self): # 取得所有的条目
  47. for index in range(self._num):
  48. for item in self._lst[index]:
  49. yield item

通过key查到的时间,可见下图

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

以上就是详解拉链法实现字典的示例的详细内容,更多请关注Gxl网其它相关文章!

人气教程排行