HashTable或字典查找时间

jqu*_*uth 5 c# dictionary hashtable

HashTable或Dictionary的查找时间是否始终为O(1),只要它具有唯一的哈希代码?

如果HashTable有1亿行,那么查找具有1行的内容需要相同的时间吗?

Han*_*ant 7

不可以.技术上可行,但获得完全相同的开销量极为罕见.哈希表被组织成桶.Dictionary <>(和Hashtable)使用如下表达式计算对象的桶号:

int bucket = key.GetHashCode() % totalNumberOfBuckets;
Run Code Online (Sandbox Code Playgroud)

因此,具有不同哈希码的两个对象可以在同一个桶中结束.存储桶是List <>,索引器接下来在该列表中搜索关键字O(n),其中n是存储桶中的项目数.

Dictionary <>动态增加totalNumberOfBuckets的值以保持存储桶搜索的效率.当您在字典中输入一亿个项目时,会有数千个存储桶.添加项目时存储桶为空的几率非常小.但如果是偶然的话,是的,检索项目需要花费同样的时间.

随着项目数量的增加,开销量增长非常缓慢.这称为摊销 O(1).