1. 平摊分析
问题:hash表应该设置为多大?(使用链表解决冲突。)
越大越好,这样查找越快;但是空间越大,浪费越大。因此,通常为存储元素的2倍。但是如果不知道要存储的元素的值呢?
方法:使用动态表,思想为vector扩展容量的方式,空间满时重新分配两倍当前大小的空间,并移动元素,释放旧的空间。
复杂度分析:每一次都有插入操作,在2的幂次方加1处还需要移动前面的所有元素。
n次操作总共的时间为n次插入加越2*n次移动。
因此n个元素插入的平摊代价(单次插入)为O(1)。
平摊分析有三种方法
1.1. 聚集分析
计算n次操作总共的时间,再做平均值。一般来说不能确定一次的平摊代价具体是多少,而是n次的。如上的方法即为聚集分析方法。
这种方法虽然用到平均的概念,但是并没有与概率相关,因此这个平均是最坏情况下的。
应用:k位的二进制计数器,如果只包含增加操作则n次操作总时间为O(n),平摊为O(1);如果包含减少操作,则n次的总时间为O(k*n),平摊代价为O(k)。
1.2. 记账法
对n个操作序列的不同操作赋予不同的平摊代价。
一次操作的实际代价如果小于其平摊代价,则差额作为存款,存起来。
一次操作的时间代价如果大于其平摊代价&