码迷,mamicode.com
首页 > 编程语言 > 详细

算法第4章实践报告

时间:2018-12-02 10:28:24      阅读:249      评论:0      收藏:0      [点我收藏+]

标签:空间   总结   体会   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、心得体会(对本次实践收获及疑惑进行总结)

贪心算法只要想到如何解决第一步的最优解,算法实现起来并不难,三道编程题中,第二题难度比较大,删数问题要知道如何去删剩下的数才是最大的,还有就是对字符串和字符数组的操作不熟悉。

算法第4章实践报告

标签:空间   总结   体会   sort   函数   难度   收获   while   疑惑   

原文地址:https://www.cnblogs.com/xixizhang/p/10051988.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!