DSAA之最大子序列之和问题(二)

原创 2018年04月16日 09:23:46

最大子序列之和的几种算法

  首先必须强调,笔者使用《DSAA》英文版有大量印刷错误,导致笔者浪费很多时间。所以建议对有疑惑的地方与别的版本对照。

1. 算法1

  常规解法,也就是穷举法:

//2_1.c
#include <stdio.h>
#include <stdlib.h>
#define handle_error(m) do{ perror(m);exit(-1);}while(0)




int maxsubsquencesum(int * ptr,int n){
    int i,j,k,thissum,maxsum=0;
    for(i=0;i<n;i++){
        for(j=0;j<n;j++)
            thissum=0;
            for(k=i;k<=j;k++){
                thissum+=*(ptr+k);
            }
            if(thissum > maxsum)
                maxsum=thissum;
    }
    return maxsum;
}


int main(void)
{
    int n;
    int * ptr;
    int i;
    scanf("%d",&n);

    if((ptr = calloc(n,sizeof(int))) == NULL)
        handle_error("calloc");
    for(i =0; i<n; i ++){
        scanf("%d",(ptr+i));
    }

    printf("max sum subsquence : %d\n",maxsubsquencesum(ptr,n));
    return 0;


}

  结果如下:

[root@localhost ~]# ./2_1         
5
-1 2 -1 2 4 
max sum subsquence : 7

  
  分析该算法的时间复杂度,由于明显具有套嵌的三个for循环,且最内层的语句的时间复杂度为O(1),所以最坏情况下该程序的时间复杂度为O(n3)。该算法也是笔者这种没有系统学过算法的所接受的穷举法。

2. 算法2

  修改maxsubsquencesum函数如下:

int maxsubsquencesum(int * ptr,int n){
    int i,j,k,thissum,maxsum=0;
    for(i=0;i<n;i++){
    thissum=0
        for(j=0;j<n;j++)
            thissum+=*(ptr+j)
            if(thissum > maxsum)
                maxsum=thissum;
    }
    return maxsum;
}

  笔者查阅了下网上其他人的理解,发现都是后验逻辑,采用举例子的方式理解。这种方式理解方式恐怕遇到新的问题就不知道怎么解了,因为是根据结果来理解过程。根据《DSAA》的提示,观察第一种解法中的

for(k=i;k<=j;k++){
                thissum+=*(ptr+k);
            }

  其对应的数学表达式为:k=ij(ptr+k),其值等于thissum(j),根据k=ij(ptr+k)=k=ij1(ptr+k)+(ptr+j),得到

thissum(j)=thissum(j1)+(ptr+j)

  用代码去表示上面的递推公式为:thissum =thissum+*(ptr+j);,然后其时间复杂度因为有两个for循环,所以为O(n2)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LoveStackover/article/details/79956270

求最大子序列和及其位置(四种经典方法)

算法部分 #include #include using namespace std; //http://blog.163.com/kevinlee_2010/blog/static/16982...
  • gukesdo
  • gukesdo
  • 2012年04月18日 09:31
  • 3570

最大子序列之和问题

最大子序列之和问题 这个问题非常有趣,因为有很多中算法可以解决这个问题。而这些算法的执行效率也多种多样。下面我们将看到四种算法,算法复杂度从指数一直过渡到线性复杂度。充分体现了算法的优劣对执行效率的影...
  • fallStones
  • fallStones
  • 2009年05月27日 00:30
  • 2185

求最大子序列之和问题

问题描述                 给定一组整数序列,求出这组序列和中的最大值,不要求求出最大的子序列。                 例如:                  ...
  • Heavy_Dream
  • Heavy_Dream
  • 2017年09月09日 21:17
  • 134

最大子序列之和

问题:给定一个数组,其中至少存在一个不小于零的数,求最大子序列之和全部序列 方法1:比较每个子序列之和,算法复杂度O(n3)O(n^3) 方法2:比较每个点开始的子序列的大小,算法复杂度O(n2)...
  • clamclam
  • clamclam
  • 2016年01月04日 21:53
  • 195

最大连续子序列 及 延伸题目

最大连续子序列问题问题定义: 给定K个整数的序列{ N1, N2, …, NK },其任意连续子序列可表示为{ Ni, Ni+1, …, Nj },其中 1 ...
  • rylq56m9
  • rylq56m9
  • 2016年08月28日 23:24
  • 651

求最大子序列之和的四种方法

四种求最大子序列和的方法,效率一个比一个高。 方法二是方法一的改进 方法三是采用分治的思想,编写递归函数 方法四 最为巧妙,代码少,效率高,逻辑清晰 对原书中的代码做了一小点...
  • aa8568849
  • aa8568849
  • 2016年09月22日 15:44
  • 418

java求最大子序列的和的问题

昨天去oracle面试,面试官很负责,先做笔试,四道题,做的不是很顺利,现在回来mark学习,革命尚未成功,同志仍需努力!加油! import java.util.Scanner; /** ...
  • mm_bit
  • mm_bit
  • 2015年11月24日 18:12
  • 433

Weiss-(DSAA - in C,2.12)最大子序列求和

最大子序列求和: A[] = {-7,5,-2,15,1,0,4}  方法1:二分法:  (1).分解成最小子问题     left  {-7,5,-2}         right  {15,1,0...
  • IOS9527o
  • IOS9527o
  • 2016年10月13日 18:14
  • 106

最大连续子序列和:动态规划经典题目(2)

问题描述:       连续子序列最大和,其实就是求一个序列中连续的子序列中元素和最大的那个。       比如例如给定序列:            { -2, 11, -4, 13, -5,...
  • samjustin1
  • samjustin1
  • 2016年07月27日 10:47
  • 6111

求最大子序列之和

今天一下午在看sharepoint了,又有活干,所以时间比较紧凑,于是想起了前些日子写的求最大子序列之和,作为每日一小题吧,暂做自我安慰吧。 求最大子序列之和,主要要注意他的效率, 1,算法复杂度是O...
  • kntao
  • kntao
  • 2009年07月23日 17:40
  • 1946
收藏助手
不良信息举报
您举报文章:DSAA之最大子序列之和问题(二)
举报原因:
原因补充:

(最多只允许输入30个字)