算法第四章上机报告
算法第四章上机实践报告
- 实践报告
1.1问题描述
最优合并问题
给定k 个排好序的序列, 用 2 路合并算法将这k 个序列合并成一个序列。 假设所采用的 2 路合并算法合并 2 个长度分别为m和n的序列需要m+n-1 次比较。试设 计一个算法确定合并这个序列的最优合并顺序,使所需的总比较次数最少。 为了进行比较,还需要确定合并这个序列的最差合并顺序,使所需的总比较次数最多。
1.2算法描述
贪心选择性质:
每次选最小的序列合并得到最少比较次数;每次选最大的序列合并得到最多比较次数。2 个长度分别为m和n的序列需要m + n -1次比较
最多比较次数=(12+11-1)+ (12+11+5-1 )+ (12+11+5 +4 -1)+ (12+11+5+4+2-1 )
最少比较次数=2+4-1+5+6-1+11+11-1((((2+4-1)+5-1)+11-1)+12-1)
最少比较次数 :每次找最小长度的两个序列进行合并
最多比较次数:每次找最大长度的两个序列进行合并
#include<iostream>
#include<algorithm>
using namespace std;
int cmp(int a,int b)
{
return a>b;
}
//最优情况
int min(int a[],int n)
{
int min=0;
for(int m=0;m<n-1;m++) {
sort(a+m,a+n);
a[m+1]=a[m]+a[m+1];
min=min+a[m+1]-1;
}
return min;
}
//最差情况
int max(int b[],int n)
{
int max=0;
for(int m=0;m<n-1;m++) {
sort(b+m,b+n,cmp);
b[m+1]=b[m]+b[m+1];
max=max+b[m+1]-1;
}
return max;
}
int main()
{
int i,n;
cin>>n;
int a[1000],b[1000];
for(i=0;i<n;i++) {
cin>>a[i];
b[i]=a[i];
}
cout<<max(b,n)<<" "<<min(a,n)<<endl;
return 0;
}
1.3.3分析该算法的时间复杂度
时间复杂度为O(nlogn)
1.4心得体会
个人感觉贪心算法最重要的就是确定贪心策略,排序这些过程,弄好了以后就很好写出来了,比dp简单。
2、对贪心算法的理解和体会
贪心选择性质时指所求问题的整体最优解可以通过一系列局部最优的选择获得,即通过一系列的逐步局部最优选择使得问题最终的选择方案是全局最优的。而动态规划是以全局的视角来看待问题的。
浙公网安备 33010602011771号