HashTable或Dictionary的查找时间是否始终为O(1),只要它具有唯一的哈希码?
如果HashTable有1亿行,那么查找具有1行的内容需要花费相同的时间吗?
答案 0 :(得分:7)
没有。这在技术上是可行的,但是获得完全相同的开销量是非常非常罕见的。哈希表被组织成桶。字典<> (和Hashtable)使用如下表达式计算对象的桶号:
int bucket = key.GetHashCode() % totalNumberOfBuckets;
因此,带有不同哈希码的两个对象可以在相同的桶中结束。存储桶是List<>,索引器接下来在该列表中搜索关键字,该关键字是O(n),其中n是存储桶中的项目数。
词典<>动态增加totalNumberOfBuckets的值以保持存储桶搜索的效率。当您在字典中输入一亿个项目时,将会有数千个桶。添加项目时存储桶为空的几率非常小。但如果是偶然的话,是的,检索项目需要花费同样的时间。
随着项目数量的增加,开销量会逐渐增加非常。这称为摊销 O(1)。
答案 1 :(得分:0)
只要没有与哈希的碰撞,是的。
答案 2 :(得分:0)
答案 3 :(得分:-2)
var dict = new Dictionary<string, string>();
for (int i = 0; i < 100; i++) {
dict.Add("" + i, "" + i);
}
long start = DateTime.Now.Ticks;
string s = dict["10"];
Console.WriteLine(DateTime.Now.Ticks - start);
for (int i = 100; i < 100000; i++) {
dict.Add("" + i, "" + i);
}
start = DateTime.Now.Ticks;
s = dict["10000"];
Console.WriteLine(DateTime.Now.Ticks - start);
这两个案例都打印0。所以似乎答案是肯定的。 [模式化了所以我会更好地解释]
似乎它是不变的。但它取决于Hash函数在所有键中给出不同的结果。由于没有可以执行此操作的哈希函数,因此它归结为您提供给词典的数据。因此,您必须使用您的数据进行测试,看它是否不变。