log(n)与常数时间

时间:2014-03-17 20:57:10

标签: data-structures big-o

HashSet类具有基本操作的恒定时间性能(addremovecontainssize)。

TreeSet基本操作(log(n)addremove方法)的时间成本为contains

因为HashSet是常量,它总是会比log(n)更快吗?

2 个答案:

答案 0 :(得分:7)

不,那不是多大哦工作。实际表现可能有所不同。

冒泡排序非常慢,但对于小型数据集,与其他“更好”的算法相比,它实际上可能表现良好。大哦描述了渐近行为,而不是具体的个别场景。

答案 1 :(得分:4)

HashSet的API文档中有一些狡猾的词:"这个类提供基本操作的恒定时间性能(添加,删除,包含和大小),假设哈希函数正确地分散元素在桶中" (强调我的)。在最坏的情况下,HashSet会缩减为链接列表,从而为这些方法提供线性性能。

此性能下降是导致一系列安全漏洞的原因: https://www.securityweek.com/hash-table-collision-attacks-could-trigger-ddos-massive-scale 其中(比如说)连接被放入哈希表中,其中哈希函数的[某些]输入在攻击者的控制之下。这导致理论上恒定时间的操作需要线性时间。

然而,

TreeSet"为基本操作(添加,删除和包含)提供保证 log(n)时间成本"。

所以:HashSet的操作应该更快,只要你的哈希函数提供哈希值的均匀分布,并且你的输入相对于该分布是适当随机的。但就保证性能而言,它是O(n)。