算法学习——贪心算法(二)

判断题

能够用贪心算法求解的问题一定能用动态规划求解 --------F
贪心算法需要满足两个条件,贪心选择性和最优子结构,动态规划算法需要满足最优子结构和重复子问题,满足贪心算法两要素的问题不一定满足动态规划算法的两个要素。

问题一

设有n个正整数,将它们连接成一排,组成一个最大的多位整数。
例如:n=3时,3个整数13,312,343,连成的最大整数为34331213。
又如:n=4时,4个整数7,13,4,246,连成的最大整数为7424613。
输入是n个正整数,输出是这n个正整数连成的最大多位整数,要求用贪心法求解该问题。答案要求包含以下内容:(1)证明问题具有贪心选择性;(2)证明问题具有优化子结构;(3)写出算法伪代码并分析算法的时间复杂度。
贪心选择性:每次选择最高位最大的数字优先输出,如果最高位相同则比较次高位,同样选择数字较大的,如果是类似123,,1230这样的情况,选择位数较少的数字。
以最高位不同为例进行证明:
假设 a 1 a 2 . . . a i b 1 b 1 . . . b n i a_1a_2...a_ib_1b_1...b_{n-i} 是最大多位数,且其最高位所在的数字 a 1 a 2 . . . a i a_1a_2...a_i 不是依据上述贪心思想选择出来的,则一定有数字 c 1 c 2 . . . c j c_1c_2...c_j 满足 c 1 > a 1 c_1>a_1 ,下面证明以 c 1 c 2 . . . c j c_1c_2...c_j 开头的数字 c 1 c 2 . . . c j d 1 d 2 . . . d n j c_1c_2...c_jd_1d_2...d_{n -j} a 1 a 2 . . . a i b 1 b 1 . . . b n i a_1a_2...a_ib_1b_1...b_{n-i} 大。
a 1 a 2 . . . a i b 1 b 1 . . . b n i < a 1 + 1 1 0 n 1 a_1a_2...a_ib_1b_1...b_{n-i}<(a_1+ 1)*10^{n-1}
c 1 c 2 . . . c j d 1 d 2 . . . d n j c 1 1 0 n 1 c_1c_2...c_jd_1d_2...d_{n -j}\geq c_1*10^{n-1}
因为 c 1 > a 1 c_1>a_1 所以 c 1 1 0 n 1 ( a 1 + 1 ) 1 0 n 1 c_1*10^{n-1}\geq (a_1+1)*10^{n-1} ,进而得到 c 1 c 2 . . . c j d 1 d 2 . . . d n j c_1c_2...c_jd_1d_2...d_{n -j} a 1 a 2 . . . a i b 1 b 1 . . . b n i a_1a_2...a_ib_1b_1...b_{n-i} 大,与 a 1 a 2 . . . a i b 1 b 1 . . . b n i a_1a_2...a_ib_1b_1...b_{n-i} 是最大的多位数矛盾。
最优子结构:复制-黏贴法容易证明。

bool campare(string i, string j)
{
    return (i+j) > (j+i);
}

sort(tmp.begin(), tmp.end(), campare);  // campare为假时交换i 和 j

平均时间复杂度 O ( n l g n ) O(nlgn)

问题二

存放于磁带上文件需要顺序访问。故假设磁带上依次存储了n个长度分别是L[1],….,L[n]的文件,则访问第k个文件需要顺次访问前K个文件(老师题目缺失) 。现给定n个文件的长度L[1],….,L[n],并假设每个文件被访问的概率相等,试设计一个算法输出这n个文件在磁带上的存储顺序使得平均访问代价最小。
答案要求包含以下内容:(1)证明问题具有贪心选择性;(2)证明问题具有优化子结构;(3)给出算法并分析算法的时间复杂度。
存储方式:长度最短的存在最前面。

长度 L1 L2 L3 Ln
访问概率 p p p p

平均访问长度为 i = 1 n p L i = p ( n L 1 + ( n 1 ) L 2 + . . . + L n ) \sum_{i = 1}^np*L_i=p*(n * L_1 + (n-1)*L_2+...+L_n) , p = 1 / n p=1/n

  1. 证明贪心选择性:利用上述的平均访问长度表达式即可证明。
  2. 最优子结构:略。
  3. 将长度排序即可。平均时间复杂度是 O ( n l g n O(nlgn)

题目三

G=(V, E)是一个具有n个顶点m条边的连通图,且可以假设边的代价为正且各不相同,设,定义T的瓶颈边是T中代价最大的边,G的一个生成树T是一棵最小瓶颈生成树,如果不存在G的生成树T’使得它具有代价更小的瓶颈边。
问:(1)G的每棵最小瓶颈树一定是G的一棵生成树吗?证明或者给出反例;
(2) G的每棵生成树都是G的最小瓶颈树吗?证明或者给出反例。

  1. 是。由最小瓶颈树的定义可知G的最小瓶颈树是G的生成树。
  2. 是。证明: l 1 < l 2 < l 3... < l m l1<l2<l3...<lm ,这m个数是G中m条边的权值。最小生成树中的边是 l 1 , l 2 , l 3... l n 1 l1,l2,l3...l{n-1} ,G的最小瓶颈树中有(n-1)条边,显然在G中无法找到(n-1)条边,并且这些边中最大的权值小于 l n 1 ln-1

题目四

给定n个自然数d1, d2, …, dn, 设计算法,在多项式时间确定是否存在一个无向图G,使它的结点度数准确地就是d1, d2, …, dn, 要求G中在任意两个结点之间至多有一条边,且不存在一个结点到自身的边。

d\\数组,保存规定的各点的度
sort(d)//将d数组按照数值从大到小排序
for i = 1 to n
    end = d[i]
    for j = (i + 1) to min(n, i + end)
        if d[j] > 0 && d[i] > 0
            d[j]--
            d[i]--
        if d[i] == 0
            break
    if d[i] > 0 
        return false//表示不可以生成指定权值的图
return true

时间复杂度 O ( n l g n ) O(nlgn)

题目五

在一个操场上摆放着n堆石子,现要将石子有次序地合并成一堆。规定每次只能选择任意两堆石子合并成新的一堆,并将新一堆石子数记为该次合并的得分。试设计贪心算法,计算出将n堆石子合并成一堆的最小得分和最大得分,写出算法的伪代码并分析算法的计算复杂性。(数组d记录这n堆石子的石子数,下标范围是0-(n-1))
计算合并这n堆石子的最小得分,最大得分类似。(sum记录合并这个石子堆的代价)

  1. 初始化sum为0
  2. 将数组d按照从小到大的顺序排序
  3. 取出最小的两个石子堆d[i],d[j],将d[i],d[j]从数组中删除,将d[i]+d[j]加进d数组,sum加上d[i]+d[j],
  4. 如果数组d大小是1,则返回sum,否则继续第2步
    使用堆排序。

题目六

利用贪心法设计算法求解下述问题:
输入:正整数集合S,正整数W
输出:S的子集合S’,其中元素之和不小于W,且S’是满足这个条件的子集合中包含元素数量最少的。
要求:(1) 阐明贪心思想 (2) 写出伪代码 (3) 证明算法正确性 (4) 分析算法时间复杂度

题目七

现有一块草坪,长为m米,宽为n米,要在横中心线上放置半径为Ri的喷水装置,每个喷水装置的效果都会让以它为中心的半径为实数Ri的圆被湿润,设有充足的喷水装置,并且一定能把草坪全部湿润,设计算法选择尽量少的喷水装置,把整个草坪的全部湿润。要求写出伪代码并分析算法正确性和复杂性。

题目八

设计贪心算法求解如下的最大生成树问题。
输入:无向连通图G=(V,E),非负加权函数w:ER+;
输出:各边权值之和达到最大值的生成树T=(V,E’)
1.简述算法的贪心思想;
2.叙述并证明问题的贪心选择性;
3.叙述问题的优化子结构
4.用伪代码表述算法并分析其时间复杂度

题目九

在黑板上写了n个正数组成的一个数列,进行如下操作:每一次擦去其中两个数a和b, 然后在数列中加入一个数a*b+1,如此下去黑板上只剩下一个数。在所有按这种方法最后得到的树中,最大的数记为max,最小的数记为min,则该数列的极差M定义为M=max-min。对于给定数列,设计贪心算法计算出其极差M,要求分析算法的正确性,写出算法的伪代码并分析其复杂性。

题目十

哈工大的机器人研究团队现有不同类型的登山机器人,这些登山机器人可以携带有限的能量登山。在登山过程中,登山机器人需要消耗一定能量,连续攀登的路程越长,其攀登的速度就越慢。在对m种不同类型的机器人进行性能测试时,已测定出机器人i连续攀登1,2,…,n米所用的时间分别为ti1, ti2, …, tin。现在要对这m个机器人进行综合性能测试,举行机器人接力连续攀登演习。攀登的总高度为s米。规定每个机器人攀登1次,每次至少攀登1米,最多攀登n米,而且每个机器人攀登的高度必须是整数,即只能在整米处接力。安排每个机器人攀登适当的高度,使完成接力攀登的总时间最短,完成下列问题。
例子:若有3个机器人,每个机器人连续攀登1,2,3米所用的时间如表中所示。每个机器人最多可以攀登3米,攀登的总高度为5米,则使完成接力攀登的总时间最短的安排方案为1号机器人攀登2米,2号机器人攀登2米,3号机器人攀登1米。

1米 2米
1号 24
2号 23
3号 22

(1)证明该问题具有贪心选择性;
(2)证明该问题具有优化子结构;
(3)根据该贪心选择性和优化子结构用伪代码写出算法;
(4)分析算法的时间复杂度。
先这样吧

发布了13 篇原创文章 · 获赞 2 · 访问量 579

猜你喜欢

转载自blog.csdn.net/qq_43887432/article/details/105408806