标签:空间 总结 体会 sort 函数 难度 收获 while 疑惑
1、实践题目
最优合并问题
2、问题描述
给定k 个排好序的序列, 用 2 路合并算法将这k 个序列合并成一个序列。 假设所采用的 2 路合并算法合并 2 个长度分别为m和n的序列需要m+n-1 次比较。试设 计一个算法确定合并这个序列的最优合并顺序,使所需的总比较次数最少。 为了进行比较,还需要确定合并这个序列的最差合并顺序,使所需的总比较次数最多。
3、算法描述
void zuida(int n,int a[])
{
int b[n];
for(int i=0;i<n;i++)
b[i]=a[i];
sort(b,b+n);
int sum=0;
int count=0;
int j=n-1;
while(j>0)
{
sum=b[j]+b[j-1]-1;
count =count +sum;
b[j-1]=b[j]+b[j-1];
j--;
}
cout<<count<<" ";
}
void zuixiao(int n,int a[])
{
int i=0;
int sum=0;
int count=0;
while(i<n-1)
{
sort(a,a+n);
sum=a[i]+a[i+1]-1;
count =count +sum;
a[i+1]=a[i]+a[i+1];
a[i]=0;
i++;
}
cout<<count;
}
要求最多比较次数,只需要让最大的数进行多次运算,所以只需要进行一次排序,从数组中最大值那边开始向最小那边开始两两合并,并把相加后的新数放进前一个数的位置中,以便和下一个数合并,累加其中的比较次数就可以得到最大的比较次数。
而最小比较次数需要每次把数值最小的数进行合并,所以每次合并过一次后需要进行一次排序。每次合并后,数组总数减少一个,所以每次i++,把不需要用的位置的值置为1.
4、算法时间及空间复杂度分析(要有分析过程)
空间复杂度是O(n),因为只需要辅助空间一个数组来记录合并的过程。
时间复杂度为O(nlogn),每次比较都需要用到sort函数,时间复杂度为O(nlogn)。
5、心得体会(对本次实践收获及疑惑进行总结)
贪心算法只要想到如何解决第一步的最优解,算法实现起来并不难,三道编程题中,第二题难度比较大,删数问题要知道如何去删剩下的数才是最大的,还有就是对字符串和字符数组的操作不熟悉。
标签:空间 总结 体会 sort 函数 难度 收获 while 疑惑
原文地址:https://www.cnblogs.com/xixizhang/p/10051988.html