什么是具有摊销复杂度要求的修改函数与没有摊销复杂度的函数?

问题描述 投票:0回答:1

修正函数的摊销与非摊销复杂度的官方理论定义是什么?这个问题在STL的C ++标准内部特别重要,但这是一个更笼统的问题。

“常量”(非变异)函数(观察者或“获取器”)可以摊销复杂度吗?

编辑:澄清显然令人困惑的“观察者”(根据上下文,这可能意味着观察功能或外部观察者)。

language-agnostic time-complexity language-lawyer complexity-theory
1个回答
0
投票

至少有三个(实际上是更多个)独立的和正交的轴,沿着这些轴可能会进行算法的渐近分析:情况(最佳,平均,最差);边界(大O,小Omega,Theta);以及是否应考虑摊销。

案例描述了所考虑的输入类别。它实际上是算法输入的子集。在进行渐进复杂度分析时,自然会根据算法的性能w.r.t将输入状态划分为子集。子集的元素。因此,您可能有一个最佳情况,算法会尽可能地渐近地执行。尽可能渐近地表现的子集;或(在平均复杂度的情况下)一组输入及其相对权重或发生概率。在没有具体描述的情况下,很自然地假设所有输入都包括在内并且权重相等。

边界描述了算法的复杂度如何针对某个类的输入渐近地表现。复杂性可以从上方,从下方或两者都有界。边界是否狭窄?从理论上讲,选择的范围实际上可能是由所考虑的情况(最佳情况的下限,最坏情况的上限等)告知的,选择是完全独立的。

摊销分析是在基础复杂性分析之上执行的,并且考虑的不是单个输入,而是输入序列。摊销分析试图解释一系列操作的总时间复杂度如何表现。例如,考虑将新元素插入到支持数组的向量结构中的简单情况。如果我们有足够的容量,则操作为O(1)。如果容量不足,则运算为O(n)。如果我们通过算术方式增加向量的容量(每次添加例如k个新点),那么我们将有O(1)次访问(k-1)/ k,而O(n)次访问1 / k在时间上,对于O(n)摊销的复杂性。但是,如果每次需要更多容量时以几何方式增加容量,那么我们发现一系列加法将具有O(1)摊销的复杂度。

真正的常数函数可以进行摊销分析,但实际上没有理由这样做。仅当潜在的少量重复请求具有较差的单个性能,而大多数请求(渐近而言)具有渐近的较好性能时,摊销分析才有意义。

© www.soinside.com 2019 - 2024. All rights reserved.