摊还分析与动态表
摊还分析(Amortized Analysis)
通常算法分析的“目标问题”都是给定1个规模为n的数据结构和1个算法,分析该算法关于n的代价并表示为O(f(n))。如果在此基础上继续分析“在该数据结构连续执行k次该算法”的问题,用乘法可得O(kf(N)),其中N是k次中最大的n。由于O是上界所以该结论完全正确,但可能不够“精确”(离确界不够近)。因为没考虑到每次算法执行后,数据结构本身的变化。如果考虑到,则可能得到小于O(kf(N))的界,并且其更能反映出该场景下的真实代价。
举例说明上述观点,假设有个“包含popAll运算”的栈,其除了能O(1)完成push,pop,top,还支持popAll运算,其实现是“循环pop直到栈顶为空”,如果popAll执行前栈中有n个元素,popAll的代价就是O(n)。然后带入场景“这个栈是某算法的一部分,该算法会多次调用这个栈的push,pop,popAll,由于这个算法很复杂,不能确定每次都调用什么运算,也不能确定每次调用前栈的元素数。只知道算法开始时栈是空的”。由于不知道元素数,popAll的O(n)代价就不精确了,但我们很想衡量这个栈在该算法中的性能表现,所以构造下面这个需要做算法分析的“目标问题”:… 阅读全文