在某些应用中,在开始的时候无法预知表中需要存储多少对象。
需要根据对象的多少调整所需要的存储空间
插入算法
—
—如果满了就分配一个二倍大小的新空间
—一次插入操作的代价
—简单分析:最坏情况每次都要扩张动态表,需要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的时候,势也等于元素数