C# - 二进制搜索a(已排序)字典

时间:2016-12-07 14:04:53

标签: c# .net dictionary search

我有一个记录文件,按字母顺序排序:

  • Andrew d432
  • Ben x127
  • ...
  • ...
  • Zac b332

第一个字段是人名,第二个字段是一些id。一旦我读取文件,我就不需要对数据进行任何更改。

我想将每条记录视为键值对,其中人名是Key。我不知道要使用哪个类来访问记录(尽可能快)。 Dictionary没有二进制搜索。另一方面,据我所知,只有在需要插入/删除数据时才应使用SortedListSortedDictionary

编辑:为了澄清,我正在谈论简单地访问记录,例如:

x = MyDic[Zac]

2 个答案:

答案 0 :(得分:7)

没有人说过为什么词典是O(1)而为什么它比二进制搜索更快。一方面是词典没有按键排序。字典的重点是转到键值引用的项目的完全 *(用于所有实际目的)位置。它不会“搜索”该项目 - 它知道您想要的项目的完全位置。

因此,二进制搜索在字典上毫无意义,因为当集合已经确切知道它的位置时,不需要“搜索”项目。

*在哈希冲突的情况下这不完全正确,但字典的原则是直接获取项目,任何其他查找都是实现细节,应该很少见。

  

另一方面,据我所知,只有在需要插入/删除数据时才应使用SortedListSortedDictionary

在添加或删除数据时,如果希望数据自动排序,则应使用它们。请注意,SortedDictionary会丢失“普通”字典的性能增益,因为它现在必须使用键值搜索位置。它的主要用途是允许您按顺序迭代键。

如果每个项目都有唯一的键值,则无需按任何特定顺序迭代项目,并希望获得最快的“获取”性能,然后Dictionary即可。

答案 1 :(得分:3)

通常字典查找比集合的二进制搜索更快。如果不是这样,有两种具体情况:

  1. 如果列表很小(在我的测试中少于15个(可能低至10个)项目,那么计算哈希码并通过字典查找的开销将比数组上的二进制搜索慢。但超过15项,字典查找胜过二进制搜索,请放下。
  2. 如果存在许多哈希冲突(由于错误的哈希函数或具有高加载因子的字典),则字典查找会变慢。如果它真的很糟糕,那么二进制搜索可能会击败字典查找。
  3. 在使用包含各种数据的.NET词典的15年中,在使用标准String.GetHashCode()方法与真实世界数据时,我从未见过#2成为问题。我遇到麻烦的唯一一次是我创建了一个糟糕的GetHashCode()方法。