Dictionary 和 Hashtable 的效率问题啊

boringame 2009-09-30 10:50:48
据说Dictionary比Hashtable的效率高,
但是据我测试Dictionary在没有键的情况下取值会出错。
而且会很慢。

我的项目又要经常取值,很可能没有键。

如何提高效率啊?
...全文
1247 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
sadshell 2011-09-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sp1234 的回复:]
数据量并不大,使用任何一个功能可用都可以。在搜索速度上没有本质差别,都是同一数量级的。Dictionary、SortedDictionary、SortedList在搜索上都差不多。有时候当数据量很小的时候基于散列的Dictionary会比基于平衡二叉树的SortedDictionary应该还快很多。

SortedDictionary的插入/删除单个元素的速度级别跟搜索一个元素的速度级别相当,因此在大量数据需要插入删除的时候可能会有100倍的效果。但是这只是对大量数据而言的。
[/Quote]

请问,按你说的,多少算“数据量很小”,多少算“大量数据”?
不知道3万条相对来说,算少的?那大概多少量的数据用SortedDictionary更快?10万。。?
我用3万条数据,插入和查询组合起来测试,是Dictionary比SortedDictionary要快很多。。

我是做数据缓存的。。。不会超过10万数据。。
kugua70708 2009-10-01
  • 打赏
  • 举报
回复
肯定不会从新排序
都已经排好序了,删除和插入的时间只是花在找位置
boringame 2009-10-01
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 sp1234 的回复:]
引用 13 楼 boringame 的回复:
引用 11 楼 sp1234 的回复:
引用 9 楼 boringame 的回复:
。。。很费解。。。
能不能直接告诉我我这样的情况用什么比较合适?


Dictionary吧。

都告诉你那三个都没有没有什么差别,怎么还费解呢。

用Dictionary岂不是还要先判断
if(dictionary.ContainsKey(键)){
  缓存=dictionary[键];
}


使用Dictionary,可以google: TryGetValue。
[/Quote]
OK。。。
结贴了
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 boringame 的回复:]
引用 11 楼 sp1234 的回复:
引用 9 楼 boringame 的回复:
。。。很费解。。。
能不能直接告诉我我这样的情况用什么比较合适?


Dictionary吧。

都告诉你那三个都没有没有什么差别,怎么还费解呢。

用Dictionary岂不是还要先判断
if(dictionary.ContainsKey(键)){
  缓存=dictionary[键];
}
[/Quote]

使用Dictionary,可以google: TryGetValue。
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 aimeast 的回复:]
一见着sp1234,就把所有能说的都说了。
其他人都没有活路了。
[/Quote]

你在这楼咋不说呢?!呵呵。
V68V6 2009-10-01
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 aimeast 的回复:]
一见着sp1234,就把所有能说的都说了。
其他人都没有活路了。
[/Quote]

在国庆快乐被我说了之后,其他人的确没活路了!!
微创社(MCC) 2009-10-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pcqpzq 的回复:]
Hashtable 索引效率高,
Dictionary 刚好相反

[/Quote]

说话得有证据啊

Dictionary可是针对Hashtable索引的缺陷
采用了链式
boringame 2009-10-01
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 aimeast 的回复:]
一见着sp1234,就把所有能说的都说了。
其他人都没有活路了。
[/Quote]
。。。此人是够阴险的。。。
aimeast 2009-10-01
  • 打赏
  • 举报
回复
一见着sp1234,就把所有能说的都说了。
其他人都没有活路了。
boringame 2009-10-01
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 sp1234 的回复:]
引用 9 楼 boringame 的回复:
。。。很费解。。。
能不能直接告诉我我这样的情况用什么比较合适?


Dictionary吧。

都告诉你那三个都没有没有什么差别,怎么还费解呢。
[/Quote]
用Dictionary岂不是还要先判断
if(dictionary.ContainsKey(键)){
缓存=dictionary[键];
}
V68V6 2009-10-01
  • 打赏
  • 举报
回复
十一快乐!!
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 boringame 的回复:]
。。。很费解。。。
能不能直接告诉我我这样的情况用什么比较合适?
[/Quote]

Dictionary吧。

都告诉你那三个都没有没有什么差别,怎么还费解呢。
  • 打赏
  • 举报
回复
Dictionary<K,T>本来就是对键值进行散列计算的,所以它跟HashTable的关键区别就在于它是强类型的。不管什么装箱拆箱,即使为了“强类型”这三个字,我也从来不使用HashTable的。
boringame 2009-09-30
  • 打赏
  • 举报
回复
。。。很费解。。。
能不能直接告诉我我这样的情况用什么比较合适?
  • 打赏
  • 举报
回复
数据量并不大,使用任何一个功能可用都可以。在搜索速度上没有本质差别,都是同一数量级的。Dictionary、SortedDictionary、SortedList在搜索上都差不多。有时候当数据量很小的时候基于散列的Dictionary会比基于平衡二叉树的SortedDictionary应该还快很多。

SortedDictionary的插入/删除单个元素的速度级别跟搜索一个元素的速度级别相当,因此在大量数据需要插入删除的时候可能会有100倍的效果。但是这只是对大量数据而言的。
boringame 2009-09-30
  • 打赏
  • 举报
回复
数据量并不大,
但是可能访问次数非常多。

就是用于缓存啦:
在进行操作之前要看看有没有缓存:
缓存=集合[键]
if(缓存!=null){
结果=操作();
集合[键]=结果;
}
大概是上面的样子。
  • 打赏
  • 举报
回复
如果“新增和删除时都会对集合重新排序”,那么插入和删除一个元素的时间复杂度就应该是n倍的O(log n),而不是O(log n)。
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pcqpzq 的回复:]
SortedDictionary 一看Sorted就知道,新增和删除时都会对集合重新排序[/Quote]

这可是开玩笑哦。“新增和删除时都会对集合重新排序”?
  • 打赏
  • 举报
回复
我也来贴一段msdn上的文字吧!

SortedDictionary 泛型类是检索运算复杂度为 O(log n) 的二叉搜索树,其中 n 是字典中的元素数。就这一点而言,它与 SortedList 泛型类相似。这两个类具有相似的对象模型,并且都具有 O(log n) 的检索运算复杂度。这两个类的区别在于内存的使用以及插入和移除元素的速度:

SortedList 使用的内存比 SortedDictionary 少。

SortedDictionary 可对未排序的数据执行更快的插入和移除操作:它的时间复杂度为 O(log n),而 SortedList 为 O(n)。

如果使用排序数据一次性填充列表,则 SortedList 比 SortedDictionary 快。


可见,SortedDictionary 的查询复杂度是 O(log n),并且插入和删除元素的复杂度也是 O(log n)。
pcqpzq 2009-09-30
  • 打赏
  • 举报
回复
Hashtable 索引效率高,但是装箱拆箱很影响效率
Dictionary 刚好相反

一般集合内容的类型固定就用用Dictionary,涉及多种类型或未知类型就用Hashtable

SortedDictionary 一看Sorted就知道,新增和删除时都会对集合重新排序,所以效率会很低,但是索引效率高
加载更多回复(2)

110,548

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧