算法好坏的标准主要是从时间和空间两个方面来考虑的。为了有一个统一的比较标准,就出现了许多算法效率的估算和分析的方法。
记得大二学习数据结构的时候,一直对“分析技术”望而生畏。最近又拿起了久违的《数据结构与算法分析》这本书啃起来。总算对“均摊分析”有了一点小小的心得。在这里记下来。
“均摊分析是对一组操作的分析。特别是均摊分析允许处理这样一种情况, n个操作在最差情况下的代价小于任何一个操作在最差情况下的代价的n倍。均摊分析并不是把注意力集中到每个操作的单独代价,然后再把他们加起来,而是看到整个一组操作的代价,再把整体的代价分摊到每一个单独的操作上去。”
这个是书上的原话,主要提供了两个信息:
- 均摊分析处理的情况不是单个操作的简单叠加。也就是说在这种情况下如果一次操作的代价是m,那么进行n次操作的代价并不是 (n * m)。其实这种情况是很常见的。因为代价的分布并不平均。在后面的例子中可以看到。
- 均摊分析的思路是从整体上对算法的效率进行把握。而不是从一次操作的情况来对算法效率定论。因为是一组操作。那么就不同与一次操作。这里就涉及到一个概率的分布的因素,最有名的就是2/8原则,这些概率的分布对算法的效率造成了很大的影响。
下面是两个书上的例子及分析:
【例1】分析对一组未排序的数组进行一组顺序检索的情况。
如果简单的分析,一次顺序查找的最差情况是找到最后一个元素才找到。那么对于一个长度为n的序列,检索的最差代价是n。如果这样的循序查找执行了n次,那么检索代价就是 (n * n)。但是,如果我们现在的情况是检索的n次中每次都是检索不同的值,也就是n次检索以后,基本数组中的每一个值都被检索了一遍。这种情况下某些元素的检索代价会很