哈希表:如何实现0(1)?

时间:2014-05-27 09:33:00

标签: c hash time-complexity

上下文:

我正在读Pomakis'哈希表实现和一个问题出现了。 Hash lookup

我经常使用Startpage来查找其他信息,但仍处于模糊状态。

问题:

如何获得0(1)时间复杂度,因为它使用链接列表来检索密钥?

问题:

结构:

typedef struct KeyValuePair_struct {
    const void *key;
    void *value;
    struct KeyValuePair_struct *next;
} KeyValuePair;

对我来说,它看起来像一个链表。如果我错了,请纠正我。

void *HashTableGet(const HashTable *hashTable, const void *key) {
    long hashValue = hashTable->hashFunction(key) % hashTable->numOfBuckets;
    KeyValuePair *pair = hashTable->bucketArray[hashValue];

    while (pair != NULL && hashTable->keycmp(key, pair->key) != 0)
        pair = pair->next;

    return (pair == NULL)? NULL : pair->value;
}

我到处都读到要获得密钥,我们必须从结构链的开头迭代到正确的结构,因为我们事先并不知道下一个结构的地址。

< =>动态分配。

所以我不明白这一点:后一段代码似乎从链的开头迭代,但作者说它是O(1)(他可能是对的,我肯定是错的我认为它是0(n))。

我知道我错过了什么。但是什么?

由于

1 个答案:

答案 0 :(得分:0)

函数HashTableGet()将首先从数组中获取其KeyValuePair

KeyValuePair *pair = hashTable->bucketArray[hashValue];

此操作为O(1)

下一个指针仅在添加新的KeyValuePair时使用不同的键产生相同的哈希值时使用。然后,下一个指针用于在列表中存储KeyValuePair。

检索时,如果密钥与第一个KeyValuePair密钥不匹配,则需要在列表中进行搜索。

while (pair != NULL && hashTable->keycmp(key, pair->key) != 0)
    pair = pair->next;