【问题标题】:SkipList<T> vs Dictionary<TKey,TValue>SkipList<T> 与 Dictionary<TKey,TValue>
【发布时间】:2011-04-11 11:29:37
【问题描述】:

我最近一直在阅读关于跳过列表的文章。

我有一个针对静态数据集执行相当复杂的 Sql 查询的 Web 应用程序。

我想实现一个缓存系统,通过它生成 sql 查询的 md5 哈希,然后如果集合中存在查询,则返回一个缓存数据集。

哪种算法更好,Dictionary 还是 SkipList?为什么?

http://msdn.microsoft.com/en-us/library/ms379573%28VS.80%29.aspx#datastructures20_4_topic4

【问题讨论】:

  • 在旁注中,我不得不提到 memcached。
  • 如果没有办法在 .NET 中使用 memcached sourceforge.net/projects/memcacheddotnet,建议 memcached 并没有多大帮助
  • 每次看到&lt;T&gt; vs &lt;S, T&gt;,我都觉得这个比较有缺陷。只是不是苹果变橘子。

标签: c# generics skip-lists


【解决方案1】:

您使用SkipList&lt;T&gt;Dictionary&lt;TKey,TValue&gt; 的原因是跳过列表保持其项目有序。如果您经常需要按顺序枚举项目,则跳过列表很好,因为它可以在 O(n) 中进行枚举。

如果您希望能够按顺序枚举但不关心枚举是否为 O(n lg n),那么 SortedSet&lt;T&gt;(或更可能是 SortedDictionary&lt;TKey, TValue&gt;)将是您想要的,因为它们使用红黑树(平衡二叉树),它们已经在标准库中。

由于您极不可能按顺序(或根本)枚举缓存,因此不需要跳过列表(同样是二叉树)。

【讨论】:

  • 根据研究来源,正确实现的 SkipList 通常可以胜过 RBTree,更不用说 SkipList 所需的资源远低于 RBTree 资源需求。我想看看 SkipList 和 SortedDictionary 之间的比较...
  • dboarman:你有这方面的研究吗?如果是这样,也许你可以评论stackoverflow.com/questions/4118109/…
【解决方案2】:

Dictionary,当然。两个原因:

  • Dictionary&lt;TKey, TValue&gt; 使用哈希表,与跳过列表中的 O(log n) 相比,检索 O(1)(即恒定时间)。

  • Dictionary&lt;TKey, TValue&gt; 已经存在并且经过充分测试和优化,而据我所知,跳过列表类不存在,因此您必须实现自己的,这需要努力使其正确并进行测试它彻底。

两者的内存消耗大致相同(当然复杂度相同,即 O(n))。

【讨论】:

    【解决方案3】:

    Skip List 给出所有字典操作的 Log(n) 平均值。如果项目的数量是固定的,那么一个带锁的哈希表会很好。内存中的展开树也很好,因为缓存就是这个词。展开树为最近访问的项目提供更快的速度。因此在诸如查找之类的字典操作中; [与散列表相比,跳过列表很慢。与哈希表相比,splay 树也很慢。][1][1]:http://harisankar-krishnaswamy.blogspot.in/2012/04/skip-list-runtime-on-dictionay.html

    如果需要在数据结构中进行本地化,那么跳过列表会很有用。例如,查找某个日期附近的航班等。但是,缓存在内存中,因此展开是可以的。哈希表和展开树不提供本地化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-14
      • 1970-01-01
      • 2011-01-16
      • 2011-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多