最近,我开始研究一个需要在内存中保留单词词典的C#.NET项目。
我的第一个方法是创建一个
Dictionary<string, string>
(其中Key将是定义的单词和值)。
运作良好,过了一段时间我决定尝试使用“桶”然后去了
Dictionary<char, Dictionary<string, string>>
其中char是内部词典中单词的第一个字母。
我的问题是:通过应用此更改,我是否真的获得了性能提升? (并使代码更复杂)
我知道词典应该是O(1),所以理论上它对于5个字或200万个是相同的。通过添加多个级别,我将重复查找时间。
谢谢!
答案 0 :(得分:0)
这里有许多因素在起作用。通过按字母分割数据,您可以将更多查找注入需要由CPU缓存的不相关类型。你更有可能颠倒缓存并获得糟糕的性能。
另一方面,如果你的很多的条目相对平均分配在他们的第一个字母上,如果你不是统一查找但只关注几个字母,那么你& #39;可能会提高查找性能。
作为最后一点,我不知道你在哪里知道字典查找(或任何字典)是O(1),你可能想考虑一下。它必然会让你的决定不正确。
答案 1 :(得分:0)
答案是 - 不,你不会通过拆分来提高哈希表的性能。而且,正如您所指出的,您总是会进行多次查找。
要提高性能,您需要减少冲突次数。假设散列函数是相同的,您唯一可以改变的是加载因子。与往常一样,速度来自空间的价格。
忽略开销,在同一空间中,您可以创建一个包含1,000个桶或10个表的表 - 使用100个。在其中放置1,000个项目将为您提供大于1.0的加载因子,并且平均值为小孩的1.0。 “幸运”表将有更好的表现,另一个 - 值得。添加时间进行额外的查找...