动态表分析

    在某些应用中,在开始的时候无法预知表中需要存储多少对象。

    需要根据对象的多少调整所需要的存储空间

插入算法

  

    —如果满了就分配一个二倍大小的新空间

  —一次插入操作的代价

    —简单分析:最坏情况每次都要扩张动态表,需要O(n)的复杂度

    —聚集法:只有在表内元素数为2的幂次的时,表才会扩张,在这些情况下一次的代价才是O(n)的

      —求和是,单领出2的幂次的项,这些项的个数不是线性的,而是logn项的

      —聚集法需要发现操作中突然变大的个别操作

    —记账法:插入付费3块钱,1块钱给最后插入的对象(扩张时复制当前元素的代价),1块钱用于给一个已经没有存款的对象

      —复制完一次以后,每个元素按理说都没有了存款了,但是多给了一块钱,不断延续有存款的状态

        —为什么会出现这种设置:比如前面使用记账法分析的栈操作,

         它1块钱用与插入这个元素,另1块钱用于弹出这个元素,之后就不会对这个元素进行操作了,但

         是这个动态表的操作,元素如果没有删除是需要不断进行操作的。所有还要延续1块钱的预付

    —势能法

      —势函数:Φ(T) = 2num[T] - size[T]

      —操作不触发动态表的扩张

      —操作触发动态表的扩张,都对应不同时期的num和size就可以了

加入删除操作

  —满时扩张,小于1/4的时候收缩

  —势函数

    Φ(T) = max(2num[T] - size[T], size[T]/2-num[T]) 

    —大于1/2的时候用前面的

    —小于1/2的时候用后面的

      —上面没有删除操作的时候,表始终处于半满以上的状态

  —特点

    —扩张的时候,即装载因子是1的收,势等于元素数

    —收缩的时候,即装载因子是1/4的时候,势也等于元素数

原文地址:https://www.cnblogs.com/siyudemo/p/3134643.html