• 动态表分析


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

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

    插入算法

      

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

      —一次插入操作的代价

        —简单分析:最坏情况每次都要扩张动态表,需要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的时候,势也等于元素数

  • 相关阅读:
    HDU 2276
    HDU 2254
    HDU 1536 & 1944
    HDU 1538
    HDU 2177
    HDU 2176
    HDU 1209
    HDU 1254
    c++ 11 default delete
    ssh免密登录
  • 原文地址:https://www.cnblogs.com/siyudemo/p/3134643.html
Copyright © 2020-2023  润新知