算法第四章上机实践报告

一、程序存储问题

 

 

1、实践题目及问题描述

 

 

2、算法描述

  这一道题其实就简单的对输入的各程序长度进行排序,然后在循环里进行叠加,后通过判断是否超过长度为L的磁带,若超过则将可存储的数目输出,若还可存储,则循环继续。

 

 

3、算法时间及空间复杂度分析(要有分析过程)

  算法时间复杂度为O(n),用了一个for循环依次存储最短程序。

  空间复杂度为O(1),没有申请额外的空间。

 

 

 

二、删数问题

 

 1、实践题目及问题描述

 

2、算法描述

 

  这一道题最主要注意的问题就是不是把最大的数删去就好,要注意高位上的数对数值大小的影响更大。故而,该题的贪心思想是通过高位与下一位的比较,若高位的数值大于下一位,则将高位删去,然后整个数组左移,len--。第二个要注意的便是,该题的输入,应用字符串进行存储,后通过b[i] = a[i]-'0';将字符串里一个一个元素存进int型的新数组。第三个要注意的就是删去处在高位的“0”,通过如下代码实现:

int i=0;
while(i<=len-1&&b[i]==0)
i++;

if(i==len)
cout<<"0"<<endl;
else
for(int j=i;j<=len-1;j++)
cout<<b[j];

 

3、算法时间及空间复杂度分析(要有分析过程)

 

  算法时间复杂度为O(n^3),用了三个循环分别就删几个数、比较、左移进行循环。

 

  空间复杂度为O(n),空间复杂度需要一个String字符串长度。

 

三、最优合并问题

 

 1、实践题目及问题描述

2、算法描述

 

  这一道题要注意不只是把输入的待合并序列的长度进行比较,在进行m+n-1后还要再进行一次排序,以得出新的待合并序列的排序,从而得到最优的最多次比较次数计算和最少比较次数计算。

  算法就是首先设定两个数组存好待合并序列的长度,后对两个数组进行升序排序。对于计算最少比较次数,其代码实现如下:

for(int i=0;i<n;i++){
        b[i+1] = b[i]+b[i+1];
        min[i] = b[i+1]-1;
        sort(b,b+n);
    }
    for(int i=0;i<n-1;i++){
        sum_2+=min[i];
    }
而计算最多次比较次数,则是
for(int i=n-1;i>0;i--){
        a[i-1] = a[i]+a[i-1];
        max[i] = a[i-1]-1;
    }
    for(int i=n-1;i>0;i--){
        sum_1+=max[i];
    }

 

3、算法时间及空间复杂度分析(要有分析过程)

 

 

 

  算法时间复杂度为O(n),用了一个for循环来进行。

 

 

 

  空间复杂度为O(2n),空间复杂度需要2个数组存储。

 

心得体会

  在越来越多次的结对编成后,发现自己对各章的算法方法掌握的更为牢固,且在分析问题方面更加的严谨和全面。针对贪心算法,也能更好地发现反例,然后在讨论中不断发现最优子结构。继续加油,好好打题的同时也多多考虑时间和空间复杂度。

 

posted on 2019-11-18 03:33  WeN。  阅读(88)  评论(0编辑  收藏  举报