前言
上一篇我们尝试使用未排序列表实现了字典,懂的都懂确实效果不好。
这次我们来尝试一下使用哈希表来做,那么就先复习一下哈希的内容吧
实现
我们的字典,需要先import两个东西
from collections import MutableMapping
from random import randrange
第一个是我们字典的基类,第二个是方便生成随机数
class MapBase(MutableMapping):
"""lightweight composite to store key-value pairs as map items"""
# 重构了一些基本方法
class _Item():
__slots__ = '_key', '_value'
def __init__(self,k,v):
self._key = k
self._value = v
def __eq__(self,other):
return self._key == other._key
def __ne__(self,other):
# 注意相等和不等的比较方式是不一样的!
return not(self==other)
def __lt__(self,other):
return self._key < other._key
# 基于哈希表的dict
class HashMapBase(MapBase):
"""abstract base class for map using hash-table with MAD compression"""
def __init__(self, cap=11, p = 109345121):
"""create an empty hash-table map"""
self._table = cap*[None]
# 含有的元素个数
self._n = 0
self._prime = p
self._scale = 1+randrange(p-1)
self._shift = randrange(p)
def _hash_function(self,k):
# 调用内部的hash函数,进行二次哈希,返回哈希码
return (hash(k)*self._scale+self._shift) % self._prime % len(self._table)
def