我有一个记录文件,按字母顺序排序:
第一个字段是人名,第二个字段是一些id。一旦我读取文件,我就不需要对数据进行任何更改。
我想将每条记录视为键值对,其中人名是Key。我不知道要使用哪个类来访问记录(尽可能快)。 Dictionary
没有二进制搜索。另一方面,据我所知,只有在需要插入/删除数据时才应使用SortedList
和SortedDictionary
。
编辑:为了澄清,我正在谈论简单地访问记录,例如:
x = MyDic[Zac]
答案 0 :(得分:7)
没有人说过为什么词典是O(1)而为什么它比二进制搜索更快。一方面是词典没有按键排序。字典的重点是转到键值引用的项目的完全 *(用于所有实际目的)位置。它不会“搜索”该项目 - 它知道您想要的项目的完全位置。
因此,二进制搜索在字典上毫无意义,因为当集合已经确切知道它的位置时,不需要“搜索”项目。
*在哈希冲突的情况下这不完全正确,但字典的原则是直接获取项目,任何其他查找都是实现细节,应该很少见。
另一方面,据我所知,只有在需要插入/删除数据时才应使用
SortedList
和SortedDictionary
。
在添加或删除数据时,如果希望数据自动排序,则应使用它们。请注意,SortedDictionary
会丢失“普通”字典的性能增益,因为它现在必须使用键值搜索位置。它的主要用途是允许您按顺序迭代键。
如果每个项目都有唯一的键值,则无需按任何特定顺序迭代项目,并希望获得最快的“获取”性能,然后Dictionary
即可。
答案 1 :(得分:3)
通常字典查找比集合的二进制搜索更快。如果不是这样,有两种具体情况:
在使用包含各种数据的.NET词典的15年中,在使用标准String.GetHashCode()
方法与真实世界数据时,我从未见过#2成为问题。我遇到麻烦的唯一一次是我创建了一个糟糕的GetHashCode()
方法。