让我们以线性探测为例,因为它很简单。寻找一个不存在且从未存在的密钥O(n)?
你有一个(虚构的)哈希表是谁的键是这样的:
1 2 3 4 5 6 7
[23| | 44|67|89| |22]
您要检查钥匙99,它不存在。它给人的哈希值5
肯定的算法是这样的:
Check 5: X
Check 6: X
Check 7: X
Check 1: X
Check 2: X
Check 3: X
Check 4: X
Reached 5 again: Key not found
当然也没有办法,该算法能告诉我们,如果键存在或不存在,除非它会检查整个表。
但是,当搜索这个答案时,我偶然发现了这个页面:https://msdn.microsoft.com/en-us/library/system.collections.hashtable.containskey(v=vs.110).aspx,它表示它是O(1)。当然,如果密钥存在,它可以是O(1),但它会不会平均呢?而最坏的情况(每次钥匙不存在?)将是O(n)。
我正确的想这个吗?
编辑: 我刚刚意识到,它会停止时,它打到一个空的空间......所以这意味着它只会达到O(n)如果表已满?这一定是你不想聚类的原因?
是的,它可能有一个关键查找操作的O(n)复杂性,但这种情况非常罕见。这只会在你的散列函数很差时才会发生,即所有或几乎所有的键映射到同一个桶。如果你有一个好的散列函数确定一个密钥的存在是O(1)。 – Enrique
该文档没有说明使用了哪种冲突解决策略。所以你不能说它是否使用线性探测。 –
这不是'Dictionary'类在.NET中实现的方式。看看https://referencesource.microsoft.com/#mscorlib/system/collections/generic/dictionary.cs,d3599058f8d79be0 –