HIT研究生算法作业5

本文探讨了贪心算法在多种最优子结构问题中的应用,包括子集选择、区间覆盖、分配问题和区间映射。通过贪心选择性和优化子结构的引理证明,展示了如何构建和分析解决这些问题的贪心算法,每个问题的时间复杂度分析表明,贪心策略能在多项式时间内找到解决方案。
摘要由CSDN通过智能技术生成

作业5

1
(1)答:设正整数集合 S = { s i ∣ i = 1 , 2 , . . . n } S = \{s_i | i =1,2,...n\} S={ sii=1,2,...n},每次从 S S S中选取最大的元素 s m a x s_{max} smax构成 S S S的子集 S ′ S' S,使得当 S ′ S' S中元素和大于等于 W W W时,包含尽可能少的元素数

(2)答:

贪心选择性

引理1:设正整数集合 S = { s i ∣ i = 1 , 2 , . . . n } S = \{s_i | i =1,2,...n\} S={ sii=1,2,...n} S S S中最大的元素为 s m a x s_{max} smax,则存在一个 S S S的子集选择问题的某个优化解包含 s m a x s_{max} smax

证:设 A A A是一个优化解, A A A中最大的元素为 a m a x a_{max} amax
如果 a m a x = s m a x a_{max} = s_{max} amax=smax,引理成立。
如果 a m a x ≠ s m a x a_{max} \ne s_{max} amax=smax,令 B = A − { a m a x } ∪ { s m a x } B = A - \{a_{max}\} \cup \{s_{max}\} B=A{ amax}{ smax}
因为 A A A中元素从 S S S中选取,所以 a m a x ≤ s m a x a_{max} \le s_{max} amaxsmax A 中 元 素 和 ≥ W A中元素和 \ge W AW,则 B 中 元 素 和 ≥ W B中元素和 \ge W BW,且 ∣ A ∣ = ∣ B ∣ |A| = |B| A=B,即 B B B是一个优化解,且包含 s m a x s_{max} smax

优化子结构

引理2:设正整数集合 S = { s i ∣ i = 1 , 2 , . . . n } S = \{s_i | i =1,2,...n\} S={ sii=1,2,...n} S S S中最大的元素为 s m a x s_{max} smax,设 A A A S S S的子集选择问题的优化解且包含 s m a x s_{max} smax,则 A ′ = A − { s m a x } A' = A - \{s_{max}\} A=A{ smax} S − { s m a x } S - \{s_{max}\} S{ smax}对于 W − s m a x W-s_{max} Wsmax选择问题的优化解。

证:假设 A ′ = A − { s m a x } A' = A - \{s_{max}\} A=A{ smax}不是 S − { s m a x } S - \{s_{max}\} S{ smax}对于 W − s m a x W-s_{max} Wsmax选择问题的优化解。则存在 B ′ B' B,使得 B ′ 元 素 和 ≥ W − s m a x B'元素和 \ge W - s_{max} BWsmax,且 ∣ B ′ ∣ < ∣ A ′ ∣ |B'| < |A'| B<A
那么构造 B = { s m a x } ∪ B ′ B = \{s_{max}\} \cup B' B={ smax}B B 中 元 素 和 ≥ W B中元素和 \ge W BW B B B S S S的一个解。
∵ ∣ A ∣ = ∣ A ′ ∣ + 1 , ∣ B ∣ = ∣ B ′ ∣ + 1 > ∣ A ′ ∣ + 1 = ∣ A ∣ , 与 A 是 优 化 解 矛 盾 ∴ \because |A| = |A'| + 1 , |B| = |B'| + 1 > |A'| + 1 = |A|,与A是优化解矛盾\\ \therefore A=A+1,B=B+1>A+1=AA A ′ = A − { s m a x } A' = A - \{s_{max}\} A=A{ smax} S − { s m a x } S - \{s_{max}\} S{ smax}对于 W − s m a x W-s_{max} Wsmax选择问题的优化解

(3)答:

算法伪代码

  • 输入:集合 S S S,阈值 W W W
  • 输出: S ′ S' S,元素之和不小于 W,且 S’是满足这个条件的子集合中包含元素数量最少的。
selectW(S,W)
	sort(S);
	S' <- new Set();
	sum <- 0;
	while(sum < W)
		sum += S.peek();
		S'.offer(S.poll())
	return S'

时间复杂度分析
输入规模: n n n
时间复杂度:排序时间复杂度为 O ( n log ⁡ n ) O(n\log{n}) O(nlogn),贪心选择步骤时间复杂度为 O ( n ) ∴ T ( n ) = O ( n log ⁡ n ) O(n) \\ \therefore T(n) = O(n\log{n}) O(n)T(n)=O(nlogn)

2
(1)答:在剩余区间 [ x , n ] [x,n] [x,n]中,对于剩余的区间集合 S = { [ a i , b i ] ∣ 1 ≤ a i ≤ i ≤ b i ≤ n , i = 1 , 2... n } S = \{[a_i,b_i] | 1 ≤ a_i ≤ i ≤ b_i ≤ n, i =1,2...n\} S={ [ai,bi]1aiibin,i=1,2...n},选取满足 a i ≤ x a_i ≤ x aix元素中, b i b_i bi值最大的区间。

(2)答:

贪心选择性

引理1:设区间集合 S = { [ a i , b i ] ∣ 1 ≤ a i ≤ i ≤ b i ≤ n , i = 1 , 2... n } S = \{[a_i,b_i] | 1 ≤ a_i ≤ i ≤ b_i ≤ n, i =1,2...n\} S={ [ai,bi]1aiibin,i=1,2...n},获得满足 a i = 1 a_i = 1 ai=1的集合并按照 b i b_i bi的值排序,得 S ′ = { [ 1 , b j ] ∣ b j ≥ b j + 1 , b j > 1 } S' = \{[1,b_j] | b_j ≥ b_{j+1},b_j > 1\} S={ [1,bj]bjbj+1,bj>1},如果 S S S存在优化解,则存在一个 S S S的优化解包含 [ 1 , b j ] , j = 1 [1,b_j], j = 1 [1,bj],j=1

证:设 A A A为一个优化解, A A A中以1开始的区间为 [ 1 , b a ] , b a > 1 [1,b_a],b_a > 1 [1,ba],ba>1
如果 b a = b 1 b_a = b_1 ba=b1,引理成立。
如果 b a ≠ b 1 b_a \ne b_1 ba=b1,令 B = A − { [ 1 , b a ] } ∪ { [ 1 , b 1 ] } B = A - \{[1,b_a]\} \cup \{[1,b_1]\} B=A{ [1,ba]}{ [1,b1]}
因为 b 1 ≥ b a b_1 ≥ b_a b1ba,所以 B B B仍是 S S S的一个解,且 ∣ B ∣ = ∣ A ∣ |B| = |A| B=A,即 B B B S S S的一个优化解且包含 [ 1 , b 1 ] [1,b_1] [1,b1]

优化子结构

引理2:设区间集合 S = { [ a i , b i ] ∣ 1 ≤ a i ≤ i ≤ b i ≤ n , i = 1 , 2... n } S = \{[a_i,b_i] | 1 ≤ a_i ≤ i ≤ b_i ≤ n, i =1,2...n\} S={ [ai,bi]1aiibin,i=1,2...n},获得满足 a i = 1 a_i = 1 ai=1并按照 b i b_i bi的值排序的集合 S ′ = { [ 1 , b j ] ∣ b j ≥ b j + 1 , b j > 1 } S' = \{[1,b_j] | b_j ≥ b_{j+1},b_j > 1\} S={ [1,bj]bjbj+1,bj>1},如果 S S S存在优化解,假设 A A A是包含 [ 1 , b 1 ] [1,b_1] [1,b1]的优化解,那么,如果 S − { [ 1 , b 1 ] } S - \{[1,b_1]\} S{ [1,b1]}对于区间 [ b 1 , n ] [b_1,n] [b1,n]的优化解存在, A ′ = A − { [ 1 , b 1 ] } A' = A - \{[1,b_1]\} A=A{ [1,b1]}是它的优化解。

证: 假设 A ′ = A − { [ 1 , b 1 ] } A' = A - \{[1,b_1]\} A=A{ [1,b1]}不是 S − { [ 1 , b 1 ] } S - \{[1,b_1]\} S{ [1,b1]}对于区间 [ b 1 , n ] [b_1,n] [b1,n]的优化解。则存在 B ′ B' B,满足覆盖的条件下, ∣ B ′ ∣ < ∣ A ′ ∣ |B'| < |A'| B<A
那么构造 B = B ′ ∪ { [ 1 , b 1 ] } B = B' \cup \{[1,b_1]\} B=B{ [1,b1]} B B B S S S关于区间 [ 1 , n ] [1,n] [1,n]的一个解。
∣ A ∣ = ∣ A ′ ∣ + 1 , ∣ B ∣ = ∣ B ′ ∣ + 1 < ∣ A ′ ∣ + 1 = ∣ A ∣ |A| = |A'| + 1, |B| = |B'| + 1 < |A'| + 1 = |A| A=A+1,B=B+1<A+1=A,与 A A A S S S的优化解矛盾。

(3)答:

算法伪代码

  • 输入:区间对数组 i n t e r v e l s = [ [ l 1 , r 1 ] , [ l 2 , r 2 ] , . . . . [ l n , r n ] ] intervels = [[l_1,r_1],[l_2,r_2],....[l_n,r_n]] intervels=[[l1,r1],[l2,r2],....[ln,rn]],区间边界 n n n
  • 输出:最少区间覆盖集合
selectN(intervels, n)
	d <- 1;
	sort(intervels); // 按照b_i升序排序。
	inervels[n + 1] = new Intervel(n, n)
	for j <- 1 to n:
		if intervels[j].l <= d && intervels[j + 1].l > d Then
			if d = intervels[j].r Then 
				return 无优化解
			results.add(intervels[j]);
			d <- intervels[j].r;
	if d = n Then return results
	else return 无优化解;

时间复杂度分析
输入规模: k = 2 n k = 2n k=2n
时间复杂度:排序时间复杂度为 O ( n log ⁡ n ) O(n\log{n}) O(nlogn),贪心选择步骤时间复杂度为 O ( n ) ∴ T ( k ) = O ( k log ⁡ k ) O(n) \\ \therefore T(k) = O(k\log{k}) O(n)T(k)=O(klogk)

3
(1)答:每次从 A 、 B A、B AB中选择剩余元素中最大的元素 A [ m a x a ] 、 B [ m a x b ] A[max_{a}]、B[max_{b}] A[maxa]B[maxb] a ( m a x a ) = m a x b a(max_{a}) = max_{b} a(maxa)=maxb

(2)答:

贪心选择性

引理1:设数组 A [ 1 , 2... n ] , B [ 1 , 2... n ] A[1,2...n],B[1,2...n] A[1,2...n],B[1,2...n]按升序排列,即 A [ i ] ≤ A [ i + 1 ] , B [ j ] ≤ B [ j + 1 ] , i = 1 , 2 , . . . n − 1 A[i] \le A[i + 1], B[j] \le B[j + 1],i = 1,2,...n - 1 A[i]A[i+1],B[j]B[j+1]i=1,2,...n1。选择 B [ n ] B[n] B[n]分配给 A [ n ] A[n] A[n],即 a ( n ) = n a(n) = n a(n)=n,则存在某个优化解包含此分配。

证:设优化解 S S S S S S中对 A [ n ] 的 分 配 为 a ( n ) A[n]的分配为a(n) A[n]a(n)
如果 a ( n ) = n a(n) = n a(n)=n,引理成立。
如果 a ( n ) ≠ n a(n) \ne n a(n)=n,设 a ( n ) = j , a ( k ) = n a(n) = j,a(k) = n a(n)=j,a(k)=n,则优化解 S S S中包含 ∣ A [ k ] − B [ n ] ∣ + ∣ A [ n ] − B [ j ] ∣ |A[k] - B[n]|+|A[n] - B[j]| A[k]B[n]+A[n]B[j]
为了构造解 S ′ S' S,讨论

情况一: A [ k ] > B [ n ] A[k] > B[n] A[k]>B[n]
则有 ∣ A [ k ] − B [ n ] ∣ = A [ k ] − B [ n ] , ∣ A [ n ] − B [ j ] ∣ = A [ n ] − B [ j ] |A[k] - B[n]| = A[k] - B[n], |A[n] - B[j]| = A[n] - B[j] A[k]B[n]=A[k]B[n],A[n]B[j]=A[n]B[j],不妨交换使得 a ( n ) = n , a ( k ) = j a(n) = n,a(k) = j a(n)=na(k)=j,得到解 S ′ S' S,有 ∣ A [ k ] − B [ n ] ∣ + ∣ A [ n ] − B [ j ] ∣ = ∣ A [ n ] − B [ n ] ∣ + ∣ A [ k ] − B [ j ] ∣ |A[k] - B[n]| + |A[n] - B[j]| = |A[n] - B[n]| + |A[k] - B[j]| A[k]B[n]+A[n]B[j]=A[n]B[n]+A[k]B[j] S ′ S' S是优化解,且包含 a ( n ) = n a(n) = n a(n)=n

情况二: A [ k ] ≤ B [ n ] , A [ n ] < B [ j ] A[k] \le B[n], A[n] < B[j] A[k]B[n],A[n]<B[j],与①做相同的交换,得到优化解 S ′ S' S,包含 a ( n ) = n a(n) = n a(n)=n

情况三: A [ k ] ≤ B [ n ] , A [ n ] ≥ B [ j ] A[k] \le B[n], A[n] \ge B[j] A[k]B[n],A[n]B[j]
∣ A [ k ] − B [ n ] ∣ + ∣ A [ n ] − B [ j ] ∣ = B [ n ] + A [ n ] − B [ j ] − A [ k ] |A[k] - B[n]| + |A[n] - B[j]| = B[n] + A[n] - B[j] - A[k] A[k]B[n]+A[n]B[j]=B[n]+A[n]B[j]A[k],交换使得 a ( n ) = n , a ( k ) = j a(n) = n,a(k) = j a(n)=na(k)=j,的解 S ′ S' S。求证 S ′ S' S为优化解,讨论

A [ n ] ≥ B [ n ] , A [ k ] ≥ B [ j ] A[n] \ge B[n], A[k] \ge B[j] A[n]B[n],A[k]B[j]
∣ A [ n ] − B [ n ] ∣ + ∣ A [ k ] − B [ j ] ∣ = A [ n ] + A [ k ] − B [ n ] − B [ j ] |A[n] - B[n]| + |A[k] - B[j]| = A[n] + A[k] - B[n] - B[j] A[n]B[n]+A[k]B[j]=A[n]+A[k]B[n]B[j]
因为 A [ k ] ≤ B [ n ] A[k] \le B[n] A[k]B[n],
所以 ∣ A [ n ] − B [ n ] ∣ + ∣ A [ k ] − B [ j ] ∣ ≤ ∣ A [ k ] − B [ n ] ∣ + ∣ A [ n ] − B [ j ] ∣ |A[n] - B[n]| + |A[k] - B[j]| \le |A[k] - B[n]| + |A[n] - B[j]| A[n]B[n]+A[k]B[j]A[k]B[n]+A[n]B[j]
得证。

A [ n ] ≤ B [ n ] , A [ k ] ≤ B [ j ] A[n] \le B[n], A[k] \le B[j] A[n]B[n],A[k]B[j]
∣ A [ n ] − B [ n ] ∣ + ∣ A [ k ] − B [ j ] ∣ = B [ n ] + B [ j ] − A [ n ] − A [ k ] |A[n] - B[n]| + |A[k] - B[j]| = B[n] + B[j] - A[n] - A[k] A[n]B[n]+A[k]B[j]=B[n]+B[j]A[n]A[k]
因为 A [ n ] ≥ B [ j ] A[n] \ge B[j] A[n]B[j],同①,得证。

A [ n ] ≥ B [ n ] , A [ k ] ≤ B [ j ] A[n] \ge B[n], A[k] \le B[j] A[n]B[n],A[k]B[j]
∣ A [ n ] − B [ n ] ∣ + ∣ A [ k ] − B [ j ] ∣ = A [ n ] + B [ j ] − B [ n ] − A [ k ] |A[n] - B[n]| + |A[k] - B[j]| = A[n] + B[j] - B[n] - A[k] A[n]B[n]+A[k]B[j]=A[n]+B[j]B[n]A[k]
因为 B [ j ] ≤ B [ n ] B[j] \le B[n] B[j]B[n],同①,得证。

A [ n ] ≤ B [ n ] , A [ k ] ≥ B [ j ] A[n] \le B[n], A[k] \ge B[j] A[n]B[n],A[k]B[j]
∣ A [ n ] − B [ n ] ∣ + ∣ A [ k ] − B [ j ] ∣ = B [ n ] + A [ k ] − B [ j ] − A [ n ] |A[n] - B[n]| + |A[k] - B[j]| = B[n] + A[k] - B[j] - A[n] A[n]B[n]+A[k]B[j]=B[n]+A[k]B[j]A[n

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值