3.4
设有n个正整数,将它们连接成一排,组成一个最大的多位整数。
例如:n=3时,3个整数13,312,343,连成的最大整数为34331213。
又如:n=4时,4个整数7,13,4,246,连成的最大整数为7424613。
输入是n个正整数,输出是这n个正整数连成的最大多位整数,要求用贪心法求解该问题。答案要求包含以下内容:(1)证明问题具有贪心选择性;(2)证明问题具有优化子结构;(3)写出算法伪代码并分析算法的时间复杂度。
首先考虑每次选择最高位最大的数,如果相等则比较次高位,在室友的提醒下,发现这个方法存在问题。例如987和98.
故修改为:对m位的数字a和n位的数字b,比较a*10 ^ (n-1)+b和b *10^(m-1)+a
bool campare(string i, string j)
{
return (i+j) > (j+i);
}
sort(tmp.begin(), tmp.end(), campare); // campare为假时交换i 和 j
3.5
存放于磁带上文件需要顺序访问。故假设磁带上依次存储了n个长度分别是L[1],….,L[n]的文件,则访问第k个文件的代价为
。现给定n个文件的长度L[1],….,L[n],并假设每个文件被访问的概率相等,试设计一个算法输出这n个文件在磁带上的存储顺序使得平均访问代价最小。。答案要求包含以下内容:(1)证明问题具有贪心选择性;(2)证明问题具有优化子结构;(3)给出算法并分析算法的时间复杂度。
存储方式:长度最短的存在最前面。
3.7
G=(V, E)是一个具有n个顶点m条边的连通图,且可以假设边的代价为正且各不相同,设,定义T的瓶颈边是T中代价最大的边,G的一个生成树T是一棵最小瓶颈生成树,如果不存在G的生成树T’是的它具有代价更小的瓶颈边。问:(1)G的每棵最小瓶颈树一定是G的一棵生成树吗?证明或者给出反例; (2) G的每棵生成树都是G的最小瓶颈树吗?证明或者给出反例。
(1)是
(2)不是
3.8
给定n个自然数d1, d2, …, dn, 设计算法,在多项式时间确定是否存在一个无向图G,使它的结点度数准确地就是d1, d2, …, dn, 要求G中在任意两个结点之间至多有一条边,且不存在一个结点到自身的边。