SkipList <t> vs Dictionary <tkey,tvalue> </tkey,tvalue> </t>

时间:2010-09-13 01:34:48

标签: c# generics skip-lists

我最近一直在阅读Skip Lists。

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

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

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

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

3 个答案:

答案 0 :(得分:15)

您使用SkipList<T> vs Dictionary<TKey,TValue>的原因是跳过列表会使其项目按顺序排列。如果您经常需要按顺序枚举项目,则跳过列表很好,因为它可以在O(n)中枚举。

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

由于您不太可能希望按顺序(或根本)枚举缓存,因此不需要跳过列表(以及二进制树)。

答案 1 :(得分:4)

绝对是

Dictionary。有两个原因:

  • Dictionary<TKey, TValue>使用哈希表,使得检索O(1)(即恒定时间)与跳过列表中的O(log n )进行比较。

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

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

答案 2 :(得分:1)

跳过列表给出了所有字典操作的平均Log(n)。如果项目的数量是固定的,那么锁定剥离的哈希表将会很好。内存展开树也很好,因为缓存是单词。 Splay树为最近访问的项目提供更快的速度。这样在字典操作中如find; [跳过列表与splay树相比较慢,与哈希表相比再次缓慢。] [1] [1]:http://harisankar-krishnaswamy.blogspot.in/2012/04/skip-list-runtime-on-dictionay.html

如果需要在数据结构中进行本地化,则跳过列表可能很有用。例如,查找日期等周围的航班。但是,缓存在内存中,因此展开是正常的。 Hashtable和splay树不提供本地化。