算法 Hw4

1 Dynamic Table

1

初始: Φ 0 = ∣ 2 ⋅ 0 − 0 ∣ = 0 \Phi_0 =|2 \cdot 0-0| = 0 Φ0=∣200∣=0

所以在第 i i i 次操作之前有:
∑ j = 1 i − 1 C ^ j = ∑ j = 1 i − 1 C j + ( Φ j − Φ j − 1 ) = Φ i − 1 − Φ 0 + ∑ j = 1 i − 1 C j = Φ i − 1 + ∑ j = 1 i − 1 C j \begin{aligned} \sum\limits_{j=1}^{i-1} \hat{C}_j &= \sum\limits_{j=1}^{i-1} C_j + (\Phi_j - \Phi_{j-1}) \\&= \Phi_{i-1} - \Phi_0+\sum\limits_{j=1}^{i-1} C_j\\&=\Phi_{i-1}+\sum\limits_{j=1}^{i-1} C_j \end{aligned} j=1i1C^j=j=1i1Cj+(ΦjΦj1)=Φi1Φ0+j=1i1Cj=Φi1+j=1i1Cj

对于 ∀ i {\forall}i i,均有 Φ i ≥ 0 \Phi_i \geq 0 Φi0,所以有 ∑ j = 1 i C ^ j ≥ ∑ j = 1 i C j \sum\limits_{j=1}^{i} \hat{C}_j \geq \sum\limits_{j=1}^{i} C_j j=1iC^jj=1iCj

对于 TABLE-DELETE 操作,有 n u m i = n u m i − 1 − 1 num_i=num_{i-1}-1 numi=numi11

  • 当装载因子 α ≥ 1 2 \alpha\geq\frac{1}{2} α21 时, s i z e i = s i z e i − 1 size_i=size_{i-1} sizei=sizei1
    C ^ i = C i + ( 2 ⋅ n u m i − s i z e i ) − ( 2 ⋅ ( n u m i + 1 ) − s i z e i ) = − 1 = O ( 1 ) \begin{aligned}\hat{C}_i&=C_i+(2\cdot num_i-size_i)-(2\cdot (num_i+1)-size_i)\\&=-1\\&=\Omicron(1)\end{aligned} C^i=Ci+(2numisizei)(2(numi+1)sizei)=1=O(1)

  • 当装载因子 α < 1 2 \alpha<\frac{1}{2} α<21 时,

    • 若删除操作不引起缩表, s i z e i = s i z e i − 1 size_i=size_{i-1} sizei=sizei1
      C ^ i = C i + ( − 2 ⋅ n u m i + s i z e i ) − ( − 2 ⋅ ( n u m i + 1 ) + s i z e i ) = 3 = O ( 1 ) \begin{aligned}\hat{C}_i&=C_i+(-2\cdot num_i+size_i)-(-2\cdot (num_i+1)+size_i)\\&=3\\&=\Omicron(1)\end{aligned} C^i=Ci+(2numi+sizei)(2(numi+1)+sizei)=3=O(1)
    • 若删除操作引起缩表, s i z e i = 2 3 s i z e i − 1 size_i=\frac{2}{3}size_{i-1} sizei=32sizei1
      C ^ i = C i + ( − 2 ⋅ n u m i + s i z e i ) − ( − 2 ⋅ ( n u m i + 1 ) + 3 2 s i z e i ) = 3 + n u m i − 1 2 s i z e i \begin{aligned}\hat{C}_i&=C_i+(-2\cdot num_i+size_i)-(-2\cdot (num_i+1)+\frac{3}{2}size_i)\\&=3+num_i-\frac{1}{2}size_i\end{aligned} C^i=Ci+(2numi+sizei)(2(numi+1)+23sizei)=3+numi21sizei
      因为将表规模变为原来的 2 3 \frac{2}{3} 32,所以 n u m i < 1 3 s i z e i − 1 = 1 2 s i z e i num_i<\frac{1}{3}size_{i-1}=\frac{1}{2}size_i numi<31sizei1=21sizei,可得:
      C ^ i = 3 + n u m i − 1 2 s i z e i < 3 ⇒ C ^ i = O ( 1 ) \begin{aligned}&\hat{C}_i=3+num_i-\frac{1}{2}size_i<3 \\\Rightarrow &\hat{C}_i=\Omicron(1)\end{aligned} C^i=3+numi21sizei<3C^i=O(1)

综上所述,对于 ∀ i {\forall}i i C ^ i = O ( 1 ) \hat{C}_i=\Omicron(1) C^i=O(1),所以 TABLE-DELETE 操作的摊还代价的上界为一个常数


2

当负载因子 α ( T ) \alpha(T) α(T) 超过某个阈值,扩展散列表的大小;当负载因子 α ( T ) \alpha(T) α(T) 低于某个阈值,收缩散列表的大小。负载因子的大小对应于散列表中元素的数量与槽位数量的比例,根据负载因子动态调整散列表的大小,可以确保散列表保持合适的大小以提供较低的碰撞率和较高的操作效率。

  • 在执行插入操作时,检查负载因子 α ( T ) \alpha(T) α(T) ,若超过一定阈值,执行扩展散列表的操作。再根据散列函数找到要插入的元素应该放置的槽位。
  • 在执行删除操作时,删除元素后,更新负载因 α ( T ) \alpha(T) α(T) 的值,若低于某个阈值,执行收缩散列表的操作。

2 Making binary search dynamic

1

SEARCH(x)操作:在 k k k 个有序数组中做有序查找。

满数组 A i A_i Ai 查找的时间复杂度为 O ( i ) \Omicron(i) O(i)

最坏情况:所有数组均满,且 x 不在任意数组中
此时时间复杂度 T ( n ) T(n) T(n) 为:
T ( n ) = ∑ i = 0 k − 1 c i = c ⋅ ⌈ l g ( n + 1 ) ⌉ ⋅ ⌈ l g ( n + 1 ) ⌉ − 1 2 = O ( l g 2 n ) T(n)=\sum\limits_{i=0}^{k-1}c_i=c\cdot\lceil lg(n+1)\rceil\cdot\frac{\lceil lg(n+1)\rceil-1}{2}=\Omicron(lg^2n) T(n)=i=0k1ci=clg(n+1)⌉2lg(n+1)⌉1=O(lg2n)


2

执行 INSERT(x) 时:(二进制数的位为 1 1 1 时,对应数组为满;位为 0 0 0,数组为空)

  • 创建一个大小为 1 1 1 的数组 S S S 存放该元素。
  • 找到数据结构中大小与 S S S 相同的数组 A l g ∣ S ∣ A_{lg|S|} AlgS
    • A l g ∣ S ∣ A_{lg|S|} AlgS 为满,创建一个新数组 S S S 有序存放原 S S S A l g ∣ S ∣ A_{lg|S|} AlgS 中的元素,并返回执行上一个步骤。
      该步骤时间复杂度为 O ( ∣ S ∣ ) \Omicron(|S|) O(S)
    • A l g ∣ S ∣ A_{lg|S|} AlgS 为空,则用 S S S 替代该数组,此时 INSERT(x) 执行完毕。
  • 若不存在与 S S S 大小相同的数组 A l g ∣ S ∣ A_{lg|S|} AlgS,直接将 S S S 作为 A k A_k Ak 插入。

最坏情况:所有数组均满
此时时间复杂度 T ( n ) T(n) T(n) 为:
T ( n ) = ∑ i = 0 ⌈ l g ( n + 1 ) ⌉ c ⋅ 2 i = O ( 2 ⌈ l g ( n + 1 ) ⌉ + 1 − 1 ) = O ( n ) T(n)=\sum\limits_{i=0}^{\lceil lg(n+1)\rceil}c\cdot2^i=\Omicron(2^{\lceil lg(n+1)\rceil+1}-1)=\Omicron(n) T(n)=i=0lg(n+1)⌉c2i=O(2lg(n+1)⌉+11)=O(n)

对于摊还时间,当数组 A i A_i Ai 从空被置为满时,对应的数组 A j A_j Aj 要被置满再置空 2 i − j − 1 2^{i-j-1} 2ij1 次。则从 0 0 0 开始不断插入元素,插入总开销小于等于插入 2 ⌈ l g ( n + 1 ) ⌉ + 1 − 1 2^{\lceil lg(n+1)\rceil+1}-1 2lg(n+1)⌉+11 个元素的开销。

与数组 A i A_i Ai 相关的开销:
T ( A i ) = 被置为满的单次开销 × 置满的次数 = 2 i ⋅ ( 1 + ∑ j = 1 k − 1 − i 2 j ) = 2 i ⋅ ( 2 k − i − 1 ) = Θ ( 2 k ) = Θ ( n ) \begin{aligned}T(A_i)&=被置为满的单次开销\times置满的次数\\&=2^i\cdot(1+\sum\limits_{j=1}^{k-1-i}2^j)\\&=2^i\cdot(2^{k-i}-1)\\&=\Theta(2^k)\\&=\Theta(n)\end{aligned} T(Ai)=被置为满的单次开销×置满的次数=2i(1+j=1k1i2j)=2i(2ki1)=Θ(2k)=Θ(n)

总开销:
T ( n ) = ∑ i = 0 k − 1 T ( A i ) = k ⋅ Θ ( n ) = Θ ( n l g n ) T(n)=\sum\limits_{i=0}^{k-1}T(A_i)=k\cdot\Theta(n)=\Theta(nlgn) T(n)=i=0k1T(Ai)=kΘ(n)=Θ(nlgn)

所以,摊还时间为 O ( l g n ) \Omicron(lgn) O(lgn)


3

记状态为满的最小下标数组为 A i A_i Ai,则 DELETE 操作需要变动的数组为:被删除的元素所在的数组 A m A_m Am A 0 , A 1 , . . . , A i A_0,A_1,...,A_i A0,A1,...,Ai

  • 通过SEARCH(x)操作找到被删除元素。
    该步骤时间复杂度为 O ( l g 2 n ) \Omicron(lg^2n) O(lg2n)
  • A m A_m Am 中的删除元素 x 替换为 A i A_i Ai 中的一个元素 y,并将 y A i A_i Ai 中删除。
  • A i A_i Ai 中的剩下 2 i − 1 2^i-1 2i1个元素填入 A 0 , A 1 , . . . , A i A_0,A_1,...,A_i A0,A1,...,Ai,置空 A i A_i Ai

最坏情况下的总时间复杂度为:
T ( n ) = Θ ( l g 2 n ) + 2 k − 1 = Θ ( n ) T(n)=\Theta(lg^2n)+2^k-1=\Theta(n) T(n)=Θ(lg2n)+2k1=Θ(n)

摊还代价为: Θ ( n 2 ) \Theta(n^2) Θ(n2)


  • 18
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值