这个问题与语言无关。但是,让我们使用C和一些伪代码进行演示。
我想在静态数组(或可选的多个静态数组)中存储hash-map / hash-table / dictionary / key-value存储,即我对条目数有一些上限,并且有这些数据结构:
Key keys[N];
Value values[N];
在我的情况下,我有typedef int Key
也许答案可能更通用。
所以这将代表的隐式字典是(Python语法):
{keys[i]: values[i] for i in range(N)}
我希望访问dict的速度很快(平均值为O(1))(对于dict中的两个键,以及不在dict中的键),最好也写入它,尽管我会从中读取很多更多。另外,在我的用例中,我事先会知道我想写的字典。所以,让我们说D
是已知的词典。我会选择N = len(D)
(D
中的条目数),尽管这可能不是最佳的。
一种天真的方式是使用一些哈希函数,hash : Key -> uint
,例如this(对于Key == int
),然后执行此操作(伪代码):
def init_by_dict(D):
keys = unset # all keys are unset initially
max_hops = 0
for key, value in D:
i = hash(key) % N
cur_max_hops = 0
while keys[i] is set:
i = (i + 1) % N
cur_max_hops += 1
max_hops = max(max_hops, cur_max_hops)
keys[i] = key
values[i] = value
然后查询看起来像:
def query(key):
i = hash(key) % N
cur_max_hops = 0
while keys[i] is set and cur_max_hops <= max_hops:
if keys[i] == key:
return values[i]
i = (i + 1) % N
cur_max_hops += 1
return unset
所以在最坏的情况下,它将是O(max_hops)。即你想要保持max_hops低。如果哈希函数是好的,init_by_dict
的天真方式可能已经具有此属性,但我不知道。
基本上我的问题是:对于给定的数据结构,init_by_dict
和query
的有效实现是什么?
我还发现this blog post也讨论了一个非常相似的设置。也许还this question。但我想知道在这个问题上是否有一些着名的理论/最先进的方法。
我还读到了open addressing这似乎与我想要的相似。还有this相关问题。和FlatMap
TensorFlow GTL class。我必须阅读更多关于此的内容。也许有人也可以回答。