第四章实践报告

1.实践题目及问题描述:

7-1 ;2 路合并算法合并 2 个长度分别为m和n的序列需要m+n-1 次比较,用 2 路合并算法将k 个排好序的序列合并成一个序列,设计一个算法确定合并这个序列的最优合并顺序(比较次数最少)和最差合并序列(比较次数最多)。

2.算法描述

比较次数最少就是每次都是合并序列中较短的两个长度,同理比较次数最多是每次都是先合并序列中较长的两个长度。

如下列代码所示,求最差合并序列步骤是先用sort函数对序列从大到小排序,用一个for循环每次合并当前最大两值,记录合并值;求最优合并序列步骤差不多,唯一不同之处在于每次合并完要再排序,因为合并值不一定是当前序列最小值。

int main()
{
    int k,a[N];
    cin>>k;
    for(int i=0;i<k;i++)
      cin>>a[i];
    sort(a,a+k,cmp);
    int x=a[0],sum1=0;
    for(int i=1;i<k;i++)
    {
        x=x+a[i];
        sum1=sum1+x-1;
    }
    sort(a,a+k);
    int sum2=0;
    int p=0;
    while(p<k-1)
   {
     int y=a[0];
     y=y+a[1];
     sum2=sum2+y-1;
     p=p+1;
     a[0]=y;
     for(int j=1;j<k-p;j++)
        a[j]=a[j+1]; 
     sort(a,a+(k-p));
   }
   cout<<sum1<<" "<<sum2<<endl;
   return 0;
}

3.时间及空间复杂度分析:

求最优合并序列时,在一个循环中用了一个sort函数,所以时间复杂度为O(n*n*logn);用了一个一维数组,所以空间复杂度为O(n)。

4.心得体会:

充分理解了贪心算法,就会思路清晰做题快速。7-1和7-3都是一类型的题,通过排序来做出当前最优选择,在这过程中我熟悉了sort函数用法。7-2删数问题理解起来就困难一点,我虽然想不出,但通过询问他人了解到了做法,开拓了思路。

转载于:https://www.cnblogs.com/lyt823/p/10049291.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值