Data structures 对数(n)与恒定时间

Data structures 对数(n)与恒定时间,data-structures,big-o,Data Structures,Big O,HashSet类对于基本操作(add、remove、contains和size)具有恒定的时间性能 TreeSet具有log(n)基本操作的时间成本(add、remove和包含方法) 因为HashSet是常量,所以它总是比log(n)快吗?不,这不是Oh的工作原理。实际表现可能有所不同 冒泡排序是出了名的慢,但对于一个小数据集,它实际上可能比其他“更好”的算法表现得更好。big Oh描述的是渐进行为,而不是具体的个别场景。HashSet的API文档中有一些黄鼠狼的话:“此类为基本操作(添加、删除

HashSet
类对于基本操作(
add
remove
contains
size
)具有恒定的时间性能

TreeSet
具有
log(n)
基本操作的时间成本(
add
remove
包含
方法)


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

不,这不是Oh的工作原理。实际表现可能有所不同


冒泡排序是出了名的慢,但对于一个小数据集,它实际上可能比其他“更好”的算法表现得更好。big Oh描述的是渐进行为,而不是具体的个别场景。

HashSet的API文档中有一些黄鼠狼的话:“此类为基本操作(添加、删除、包含和大小)提供了恒定的时间性能,假设哈希函数将元素正确地分散在存储桶中。”在最坏的情况下,HashSet简化为一个链表,为这些方法提供线性性能

这种性能下降是一系列安全漏洞的原因: 其中(比如)连接被放入一个哈希表,其中哈希函数的[部分]输入由攻击者控制。这导致理论上的常数时间操作需要线性时间

然而,TreeSet“为基本操作(添加、删除和包含)提供了保证的日志(n)时间成本”


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

HashSet
O(n)
。最好的情况是
O(1)。你还必须考虑你在一段时间内所做的操作的次数,以查看不同算法中的值。它们不象一个> B,它们有一些不同的属性。TreSeT维护排序,HashSet没有。还有,为什么使用安卓标签?这是不特定的。常数时间比log(n)更好。在大多数情况下,时间。在对数(n)小于常数的边缘情况下,它会更快(在现实世界中)。记住,十亿和1在大O表示法中都是“常数”。这不是摊销的意思。摊销的O(1)时间将是n个操作需要O(n)时间,即使其中一些操作可能需要更多时间(例如O(n))时间。“平均值”是正确的技术术语,“摊销”并不是它的同义词(另外,它指的是案例,而不是某种案例的界限)。事实上,经过反思,我不确定“平均值”是否正确。由于某些操作将比O(1)更糟糕(即当发生哈希冲突时),我们只能“平均”O(1)如果某些操作速度更快,这是不可能的。鉴于以上关于哈希函数行为的假设,大多数操作将是O(1),但我不确定您是否可以做出任何关于“平均”性能的非武装声明。@user3392484您是对的,您不能说哈希容器是O(1)但是,你的推理是错误的,即使当一些OPS是O(n),没有一个比O(1)快时,你可以平均O(1),如果<代码> n>代码>只发生在每个<代码> n< /C>元素(难以解释,但是C++ <代码> STD::vector < /代码>)。@MooingDuck不,不,你还混淆了平均情况和摊销复杂性。@MooingDuck你一定混淆了一些东西,因为它们是完全不同的野兽。“一系列操作的平均性能”是摊销复杂性;average(-case)复杂性是一项操作的成本。虽然这两项操作通常都用“平均”一词来解释,但在平均情况下,它是平均投入,而对于摊销,它是平均操作。您可以从中进行2D分类:最佳/平均/最差情况下的摊销/非摊销成本是多少?