我正在读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))。
我知道我错过了什么。但是什么?
由于
答案 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;