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

C#-二进制搜索(排序)字典,c#,.net,dictionary,search,C#,.net,Dictionary,Search,我有一个按字母顺序排列的记录文件: 安德鲁d432 本x127 扎克b332 第一个字段是人名,第二个字段是某个id。读取文件后,我不需要对数据进行任何更改 我想将每个记录视为一个键值对,其中人名是键。我不知道使用哪个类来访问记录(尽可能快)词典没有二进制搜索。另一方面,据我所知,SortedList和SortedDictionary应仅在需要插入/删除数据时使用 编辑:澄清一下,我指的是访问记录,比如: x = MyDic[Zac] 一般来说,字典查找将比集合的二进制搜索更快。有两种

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

  • 安德鲁d432
  • 本x127
  • 扎克b332
第一个字段是人名,第二个字段是某个id。读取文件后,我不需要对数据进行任何更改

我想将每个记录视为一个键值对,其中人名是键。我不知道使用哪个类来访问记录(尽可能快)<代码>词典没有二进制搜索。另一方面,据我所知,
SortedList
SortedDictionary
应仅在需要插入/删除数据时使用

编辑:澄清一下,我指的是访问记录,比如:

x = MyDic[Zac]
一般来说,字典查找将比集合的二进制搜索更快。有两种具体情况并非如此:

  • 如果列表很小(在我的测试中,少于15项(可能低至10项),那么计算哈希代码和进行字典查找的开销将比数组上的二进制搜索慢。但超过15项,字典查找胜过二进制搜索
  • 如果有许多散列冲突(由于坏的散列函数或具有高负载因子的字典),则字典查找速度会减慢。如果真的很糟糕,那么二进制搜索可能会击败字典查找
  • 在使用.NET字典保存各种数据的15年中,我从未见过在实际数据中使用标准
    String.GetHashCode()
    方法时#2会出现问题。我唯一遇到麻烦的时候就是创建了一个错误的
    GetHashCode()
    方法。

    一般来说,字典查找比集合的二进制搜索要快。有两种具体情况并非如此:

  • 如果列表很小(在我的测试中,少于15项(可能低至10项),那么计算哈希代码和进行字典查找的开销将比数组上的二进制搜索慢。但超过15项,字典查找胜过二进制搜索
  • 如果有许多散列冲突(由于坏的散列函数或具有高负载因子的字典),则字典查找速度会减慢。如果真的很糟糕,那么二进制搜索可能会击败字典查找
  • 在使用.NET字典保存各种数据的15年中,我从未见过在实际数据中使用标准
    String.GetHashCode()
    方法时#2会出现问题。我唯一遇到麻烦的时候是我创建了一个糟糕的
    GetHashCode()
    方法。

    没有人说为什么字典是O(1),为什么它比二进制搜索快。一个侧重点是字典不是按键排序的。字典的全部要点是转到键值引用的项的精确*(出于所有实际目的)位置。它不“搜索”项目-它知道您想要的项目的确切位置

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

    *在散列冲突的情况下,这并不完全正确,但字典的原则是直接获取项,任何额外的查找都是实现细节,应该很少

    另一方面,据我所知,
    SortedList
    SortedDictionary
    应仅在需要插入/删除数据时使用

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

    如果每个项都有一个唯一的键值,不需要按任何特定顺序迭代这些项,并且想要最快的“获取”性能,那么
    字典
    就是最好的选择。

    没有人说明为什么字典是O(1),为什么它比二进制搜索快。一个侧重点是字典不是按键排序的。字典的全部要点是转到键值引用的项的精确*(出于所有实际目的)位置。它不“搜索”项目-它知道您想要的项目的确切位置

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

    *在散列冲突的情况下,这并不完全正确,但字典的原则是直接获取项,任何额外的查找都是实现细节,应该很少

    另一方面,据我所知,
    SortedList
    SortedDictionary
    应仅在需要插入/删除数据时使用

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


    如果每个项都有一个唯一的键值,不需要按任何特定顺序迭代项,并且想要最快的“获取”性能,那么
    Dictionary
    就是最好的选择。

    Dictionary将具有恒定的时间访问权限,因为它将使用键的散列作为值的索引。假设您需要精确的匹配查找,则无需进行二进制搜索。您有一个字典,它(应该)为您提供对您想要的任何键/值(如果存在)的访问权限。你到底想搜索什么?如果你的密钥都是唯一的-那么
    Dictiona