C# 斯基普利斯特<;T>;vs字典<;TKey,TValue>;

C# 斯基普利斯特<;T>;vs字典<;TKey,TValue>;,c#,generics,skip-lists,C#,Generics,Skip Lists,我最近一直在读有关跳过列表的文章 我有一个web应用程序,它对静态数据集执行非常复杂的Sql查询 我想实现一个缓存系统,通过该系统,我生成sql查询的md5哈希,然后返回查询的缓存数据集(如果该数据集存在于集合中) 字典还是SkipList,哪种算法更好?为什么? 肯定是字典。原因有二: Dictionary使用哈希表,与跳过列表中的O(logn)相比,检索O(1)(即恒定时间) Dictionary已经存在,并且经过了良好的测试和优化,而据我所知,skip list类并不存在,因此您必须实现

我最近一直在读有关跳过列表的文章

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

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

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


肯定是字典。原因有二:

  • Dictionary
    使用哈希表,与跳过列表中的O(logn)相比,检索O(1)(即恒定时间)

  • Dictionary
    已经存在,并且经过了良好的测试和优化,而据我所知,skip list类并不存在,因此您必须实现自己的类,这需要付出努力才能将其正确并彻底测试


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

使用
SkipList
vs
Dictionary
的原因是跳过列表将其项保持有序。如果您经常需要按顺序枚举项目,那么跳过列表很好,因为它可以按O(n)进行枚举

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


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

跳过列表给出所有字典操作的平均日志(n)。如果项目的数量是固定的,那么一个锁剥离哈希表将非常有用。内存中的splay树也很好,因为cache是单词。Splay树为最近访问的项目提供更快的速度。在查找等字典操作中;[跳过列表与splay tree相比速度较慢,而splay tree与哈希表相比速度也较慢。][1][1]:


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

另一方面,我觉得有必要提到memcached。如果每次我看到
vs
时都无法在.NET中使用memcached,那么建议memcached并没有多大帮助。我觉得这种比较是有缺陷的。根据研究来源的不同,一个恰当实施的SkipList通常可以胜过RBTree,更不用说SkipList所需的资源远远低于RBTree所需的资源。我想看看SkipList和SortedDictionary之间的比较……鲍曼:你有这方面的研究吗?如果是的话,也许你可以评论一下