zoukankan      html  css  js  c++  java
  • 【软件工程】代码复审与子数组最大和线性算法寻找问题

    小组成员:刘铸辉 何晓楠

    1.子数组最大和线性算法

      题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。

      例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18

      如果没有O(n)这条要求,那么我们可以通过枚举法,枚举出所有的子数组,然后分别对每个子数组求和,这个规模将达到O(n3).

      在课堂上我和小楠就用了这样的算法。

     1 int zuida(const int A[],int N)    
     2 {    
     3     int ThisSum=0 ,MaxSum=0,i,j,k;    
     4     for(i=0;i<N;i++)    
     5         for(j=i;j<N;j++)    
     6         {    
     7             ThisSum=0;    
     8             for(k=i;k<j;k++)    
     9                 ThisSum+=A[k];    
    10                 
    11             if(ThisSum>MaxSum)    
    12                 MaxSum=ThisSum;    
    13         }    
    14         return MaxSum;    
    15 }    

      结果虽然是对的,但是并没有达到老师的要求,课下通过查资料和学习,练习了网上的一些经典的算法以后,理清了O(n)算法的基本思想

      O(n)算法的基本思想是依次扫描数组中所有的数,用一个变量sum来保存当前所有子数组和中最大的那个值,用另外一个变量b记录扫描到第i个数的时候,所有子数组的最大值,一旦发现b的值为负数,则将之前的子数组全部抛弃,所以b置为0,直到b的值大于sum的值才更新bsum的值,当整个数组扫描完毕的时候,所有子数组的最大值也就算出来了。

      以下是我们的算法及实现结果。

     1 #include<string.h>
     2 #define N 10
     3 int zuida(int a[N])
     4 {
     5     int sum=0;
     6     int m=0;
     7     int i;
     8     int b=0;
     9     for(i=0;i<N;i++)
    10     {
    11         if(b<0)
    12             b=a[i];
    13         else
    14             b=b+a[i];
    15         if(sum<b)
    16             sum=b;
    17     }
    18     return sum;
    19 }
    20 
    21 void main()
    22 {
    23     int a[N]={-2,5,3,-6,4,-8,6};
    24     printf("最大子数组的和为%5d
    ",zuida(a));
    25 }

    结果:

    其实上面的算法很简单,核心思路就是

    1. 当前面的几个数,加起来后,b<0后,   
    2. 把b重新赋值,置为下一个元素,b=a[i]。   
    3. 当b>sum,则更新sum=b;   
    4. 若b<sum,则sum保持原值,不更新。

    2.关于代码的复审问题

    1.方法定义太粗糙。(int zuida)

    2.通篇没有注释。而且注释是因该随着程序的修改不断更新的。而如果不是这样的话,一个误导的注释可能比没有注释更加糟糕。

    3.有些地方其实可以简化代码,比如

    4.整体结构还算清晰。

    5.给出完整的测试用例应该会更好一些。

  • 相关阅读:
    TP连接数据库报错:SQLSTATE[HY000] [2002] No such file or directory (原)
    linux的查找命令 find whereis locate
    windows下cmd无法使用telnet命令解决方法 (原)
    CDN和智能DNS原理和应用 (原)
    面试:sql语句-1-基础查询
    面试问题:对框架的理解
    Hub,bridge,switch and router的区别
    If you ever have a broken heart
    virt-viewer的简单使用
    各种虚拟化镜像文件格式
  • 原文地址:https://www.cnblogs.com/huiyuan/p/zishuzu.html
Copyright © 2011-2022 走看看