正如我在维基百科上读到的那样,哈希表的搜索时间平均为O(1)
。
所以我想说我有一个非常大的字典,其中包含数千万条记录。
如果我使用Dicionary.ContainsKey
来提取针对给定密钥的值,那么它的查找时间实际上是1,或者它会像log n或其他内容,因为.NET会有一些不同的内部实现。
答案 0 :(得分:2)
大哦符号并没有告诉你需要多长时间。它会告诉你如何缩放。
最容易想象的是在List<>中搜索项目,它具有O(n)复杂度。如果在一个包含一百万个元素的列表中找到一个项目,平均需要2毫秒,那么如果该列表有两百万个元素,则可能需要4毫秒。它与列表的大小成线性比例。
O(1)预测用于在字典中查找元素的常量时间。换句话说,它不依赖于字典的大小。如果字典是两倍大,找不到元素需要两倍的时间,它需要(大致)时间。 “粗略”意味着它实际上需要更长时间,它是摊销 O(1)。
答案 1 :(得分:1)
它仍然接近O(1)
,因为它仍然不依赖于条目的数量,而是取决于你拥有的碰撞数量。无论您拥有多少项目,索引数组仍为O(1)
。
此外,由于实施导致Dictionary
的大小似乎存在上限:How is the c#/.net 3.5 dictionary implemented?
一旦我们通过这个大小,下一步将落在内部数组之外,它将手动搜索更大的素数。这将是非常缓慢的。您可以使用7199369(数组中的最大值)进行初始化,或者考虑在词典中是否有超过约500万个条目可能意味着您应该重新考虑您的设计。
答案 2 :(得分:0)
关键是什么?如果密钥是Int32,则是,它将接近订单1.
如果存在哈希冲突,则只能获得低于1的顺序 作为密钥的Int32将具有零哈希冲突但是不保证零哈希桶冲突。
小心产生哈希冲突的键 KVP和元组可能会产生大量的哈希冲突,并且不适合使用密钥。