如何在内部维护词典?

时间:2009-10-21 12:49:58

标签: c# dictionary

当我说

Dictionary<int,string>

它相当于两个不同的数组,例如:

int[] keys =new int[] { 1, 2, 3 };
string[] values=new string[]{"val1","val2","val3"};

4 个答案:

答案 0 :(得分:5)

那不是太远了。查看Reflector中的源代码,似乎使用了三个内部集合:

private Entry<TKey, TValue>[] entries;
private KeyCollection<TKey, TValue> keys;
private ValueCollection<TKey, TValue> values;

请注意,还有一个int[] buckets变量用于跟踪哈希代码冲突情况下所需的buckets

这些变量的目的应该都是相当不言自明的。无论如何,这并不特别令人惊讶,因为Dictionary类是已知的并且有记录可以提供(理想情况下,每个桶有一个项目)O(1)查找时间。

答案 1 :(得分:3)

它是哈希表。对于每个键,Dictionary计算其哈希码,并将其用作指向值应驻留的位置的指针。如果有两个键匹配相同的哈希码,则这种情况称为冲突,在内部对于这种特殊情况,Dictionary使用二叉树。

Dictionary(哈希表)的算法复杂度是O(1),最坏的情况是O(log(N))(最坏的情况意味着我们只处理冲突),其中N是Dictionary中的一些元素。

答案 2 :(得分:2)

这一切都写在MSDN上:

  

Dictionary(Of TKey,TValue)泛型类提供从一组键到一组值的映射。字典的每个添加都包含一个值及其关联的键。通过使用其键来检索值非常快,接近于O(1),因为Dictionary(Of TKey,TValue)类被实现为哈希表。

答案 3 :(得分:1)

不,这是一个哈希表。好吧,这不是一个哈希表,但它确实非常密切相关。

http://en.wikipedia.org/wiki/Hash_table

http://www.kirupa.com/net/dictionary_hashtable.htm

相关问题