s [0] * 31 ^(n-1)+ s [1] * 31 ^(n-2)+ ... + s [n-1]。是java字符串的哈希函数,我假设其余语言与此实现类似或接近。
如果我们有hash-Table和50个元素的列表。每个元素是7个字符ABCDEF1,ABCDEF2,ABCDEF3 ..... ABCDEFn
如果每个哈希表桶都包含5个字符串(我认为这个函数会使每个桶有一个字符串,但我们假设它是5个字符串。)
如果我们调用col.Contains(“ABCDEFn”); //将进行6次比较并发现7日的差异。
哈希表将进行大约70次操作(乘法和加法)以获取哈希码并与桶中的5个字符串进行比较。而它发现了。
对于列表,需要大约300次比较才能找到它。
对于只有10个元素的情况,该列表将需要大约70个操作,但Hashtable将需要大约50个操作。并注意哈希表操作更耗时(它是乘法)。
我得出结论,.Net中的HybirdDictionary可能是大多数需要Hashtable大小未知的情况的最佳选择,因为它会让我使用一个列表,直到列表变成超过10个元素。仍然需要像HashSet而不是键和值的词典,我想知道为什么没有HybirdSet !!
那你觉得怎么样?
由于
答案 0 :(得分:3)
这真的很重要吗?您通常关心大量数据集对性能的影响。如果收集量很小,则可以进行20-30次额外操作。
答案 1 :(得分:1)
我认为你提出了一个好点。对于小数字,列表可能比哈希表更快,这在文献中已有详细记载。
但是,您可以轻松创建自己的数据结构,根据其大小count()
将使用列表或哈希。