【问题标题】:SortedDictionary<> or (Dictionary<> Manual Sort)SortedDictionary<> 或 (Dictionary<> 手动排序)
【发布时间】:2013-03-01 05:20:34
【问题描述】:

考虑到我需要一个已排序的字典,所以当我使用 SortedDictionary&lt;&gt; 而不是 Dictionary&lt;&gt; 时,性能是否会受到影响,所以如果我使用字典,我将不得不手动对其进行排序。哪个会更快? SortedDictionary&lt;&gt; 或(Dictionary&lt;&gt; + 手动排序)。

【问题讨论】:

  • 你使用什么类型的键和值,你执行什么操作?
  • 当您使用Stopwatch 并对其进行测量时发生了什么?
  • 如果你以前没有写过排序,我推荐第二个选项,这样你就会知道为什么第一个选项是正确的。如果您之前编写过排序,请使用第一个选项,直到您遇到可衡量的重要性能问题。
  • 我最近在 A-star 实现中测试了用手动 MinHeap 替换 SortedDIctionary。我在长路径上的性能提高了大约 40%。
  • 相当不错的比较和解释在这里:social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/…

标签: c# optimization dictionary sorteddictionary


【解决方案1】:

插入SortedDictionary 是 O(log(n)),所以插入 n 项是 O(n log(n))。相反,插入Dictionary 是 O(1),因此插入 n 个项目是 O(n),但您需要在使用前对项目进行排序,即 O(n log(n))。基于此,没有太大区别,但Dictionary 具有哈希开销,而 SortedDictionary 可能具有更差的内存局部性,因为它可能是作为链接结构实现的。

SortedDictionary 还限制了您可以使用的键类型,因为它需要按键排序,而 Dictionary 则没有,因为它使用散列。

真的,哪个更好取决于您的访问模式,所以最好的办法是针对您的用例衡量两者的性能。

【讨论】:

  • 好答案。这还取决于他是否进行了大量查找或删除,对于 SortedDictionary 和 O(1) 对于 Dictionary,这两者都是 O(log(n))。
【解决方案2】:

性能受到影响。阅读http://msdn.microsoft.com/en-us/library/f7fta44c.aspx的备注

基本上,SortedDictionary&lt;T&gt; 是二叉搜索树,而 Dictionary&lt;T&gt; 是哈希表。

对于插入、删除和随机查找,Dictionary&lt;T&gt; 会更快。 SortedDictionary 按顺序进行不频繁的修改和频繁的列表会更快。 Dictionary 如果您进行频繁的修改和随机查找会更快,并且很少需要排序然后输出。

【讨论】:

    【解决方案3】:

    这真的取决于你如何使用字典。

    • 您使用的项目很多还是不是很多。
    • 与需要对它们进行排序的时间相比,您添加新项目的频率是多少。
    • 您是否进行了更多查找或插入操作

    最好的办法是使用这两种方法对真实数据进行一些性能测试,看看哪种方法更适合您的情况。

    【讨论】:

      【解决方案4】:

      这取决于您是将数据添加到字典中而不是获取排序结果,还是一次性完成。

      如果您在较长时间内添加数据,使用SortedDictionary&lt;&gt; 的每次添加都会对性能造成小幅影响,但当您最终想要排序结果时,您会立即得到它。例如,如果您等待用户输入添加项目,这是理想的选择,因为小的性能影响并不明显。

      如果您创建一个字典,向其中添加数据并立即获得排序结果,Dictionary&lt;T&gt; 会更快,因为它使用了更快的排序算法(因为它可以一次对所有内容进行排序,而不是保持排序添加项目时的结果)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-06
        • 1970-01-01
        • 1970-01-01
        • 2010-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多