在静态数组

时间:2018-03-27 15:24:43

标签: arrays data-structures hash hashmap

这个问题与语言无关。但是,让我们使用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_dictquery的有效实现是什么?

我还发现this blog post也讨论了一个非常相似的设置。也许还this question。但我想知道在这个问题上是否有一些着名的理论/最先进的方法。 我还读到了open addressing这似乎与我想要的相似。还有this相关问题。和FlatMap TensorFlow GTL class。我必须阅读更多关于此的内容。也许有人也可以回答。

0 个答案:

没有答案