The maximum subarray problem is the task of finding the contiguous subarray within a one-dimensional array of numbers (containing at least one positive number) which has the largest sum. For example, for the sequence of values −2, 1, −3, 4, −1, 2, 1, −5, 4; the contiguous subarray with the largest sum is 4, −1, 2, 1, with sum 6. --from wiki

下面我们分析四种算法的时间性能,由于运行时间相差较大,我们分成两组进行对比:

环境:ubuntu 12.04

时间单位:ms

时间性能:presume that the input is preread

第一组:输入数据元素个数2000

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
 
/*************************************************************************
    > File Name: algorithm1.c
    > Author: Simba
    > Mail: dameng34@163.com
    > Created Time: 2012年12月24日 星期一 22时41分56秒
 ************************************************************************/

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<sys/time.h>

int maxsubsum1(const int a[], int n)
{
    int thissum, maxsum, i, j, k;

maxsum = 0;
    for (i = 0; i < n; i++)
    {
        for (j = i; j < n; j++)
        {
            thissum = 0;
            for (k = i; k <= j; k++)
                thissum += a[k];

if (thissum > maxsum)
                maxsum = thissum;
        }
    }
    return maxsum;
}

int maxsubsum2(const int a[], int n)
{
    int thissum, maxsum, i, j;

maxsum = 0;
    for (i = 0; i < n; i++)
    {
        thissum = 0;
        for (j = i; j < n; j++)
        {
            thissum += a[j];

if (thissum > maxsum)
                maxsum = thissum;
        }
    }
    return maxsum;
}

long GetTickCount(void)
{
    struct timeval tv;

gettimeofday(&tv, NULL);

return (tv.tv_sec * 1000 + tv.tv_usec / 1000);
}

int main(void)
{
    int i, n = 2000;
    int *ptr = malloc(sizeof(int) * n);
    srand(time(NULL));
    for (i = 0; i < n; i++)
        ptr[i] = rand() % 50 - 25;
    // adopt algorithm  1
    unsigned int utimecost = GetTickCount();
    int result = maxsubsum1(ptr, n);
    utimecost = GetTickCount() - utimecost;
    printf("max subsequence sum is %d, time cost %d\n", result, utimecost);

// adopt algorithm  2
    utimecost = GetTickCount();
    result = maxsubsum2(ptr, n);
    utimecost = GetTickCount() - utimecost;
    printf("max subsequence sum is %d, time cost %d\n", result, utimecost);

free(ptr);

return 0;
}

输出为:

max subsequence sum is 275, time cost 4423
max subsequence sum is 275, time cost 6

第二组:输入数据元素个数 1000000

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
 
/*************************************************************************
    > File Name: divide_conquer.c
    > Author: Simba
    > Mail: dameng34@163.com
    > Created Time: 2012年12月24日 星期一 23时24分41秒
 ************************************************************************/

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include <sys/time.h> /* struct timeval, gettimeofday(), struct itimerval, setitimer(), ITIMER_REAL */

int divide_conquer(int arr[], int start, int end)
{
    if(start == end)
        return (arr[start] > 0 ? arr[start] : 0);

int mid = (start + end) / 2;
    int max_left = divide_conquer(arr, start, mid);
    int max_right = divide_conquer(arr, mid + 1, end);
    // mid subsequence

int max_left_border = 0;
    int tmp_sum = 0;
    int i;

for(i = mid; i >= start; i--)
    {
        tmp_sum += arr[i];
        if(tmp_sum > max_left_border)
            max_left_border = tmp_sum;
    }

int max_right_border = 0;
    tmp_sum = 0;
    for(i = mid + 1; i <= end; i++)
    {
        tmp_sum += arr[i];
        if(tmp_sum > max_right_border)
            max_right_border = tmp_sum;
    }

int max_mid = max_left_border + max_right_border;
    // max subsequence
    int iresult = max_left;
    if(max_right > iresult)
        iresult = max_right;
    if(max_mid > iresult)
        iresult = max_mid;
    return iresult;
}

int maxsubsum3(const int a[], int n)
{
    int j, thissum, maxsum;
    thissum = maxsum = 0;
    for (j = 0; j < n; j++)
    {
        thissum += a[j];

if (thissum > maxsum)
            maxsum = thissum;
        else if (thissum < 0)
            thissum = 0;
    }

return maxsum;
}

long GetTickCount(void)
{
    struct timeval tv;

gettimeofday(&tv, NULL);

return (tv.tv_sec * 1000 + tv.tv_usec / 1000);
}

int main(void)
{
    int i, n = 1000000;
    int *ptr = malloc(sizeof(int) * n);
    srand(time(NULL));
    for (i = 0; i < n; i++)
        ptr[i] = rand() % 50 - 25;
    // adopt divide_conquer algorithm
    unsigned int utimecost = GetTickCount();
    int result = divide_conquer(ptr, 0, n - 1);
    utimecost = GetTickCount() - utimecost;
    printf("max subsequence sum is %d, time cost %d\n", result, utimecost);
    // adopt algorithm 3
    utimecost = GetTickCount();
    result = maxsubsum3(ptr, n);
    utimecost = GetTickCount() - utimecost;
    printf("max subsequence sum is %d, time cost %d\n", result, utimecost);

free(ptr);

return 0;
}

输出为:

max subsequence sum is 2410, time cost 217
max subsequence sum is 2410, time cost 4

分析:

在《data
structure and algorithm analysis in
c》中有对这四种算法时间性能的分析,依次下来分别是O(n^3),O(n^2),O(nlogn),O(n),即使我们在第二组输入的元素个数是第一组的500倍,第二组的运行时间都要比第一组的小。下图2-2是作者写书时测试的时间列表,显然现在的机器运行得更快。

Solutions for the Maximum Subsequence Sum Problem的更多相关文章

  1. MAXIMUM SUBSEQUENCE SUM PROBLEM

    排除不合理的项(负值), 设定一个标杆sum, 往后扫描看是否有比sum好的情况. We should ensure the following conditions: 1. The result m ...

  2. Maxmum subsequence sum problem

    We have a lot of ways to solve the maximum subsequence sum problem, but different ways take differen ...

  3. Algorithm for Maximum Subsequence Sum z

    MSS(Array[],N)//Where N is the number of elements in array { sum=; //current sum max-sum=;//Maximum ...

  4. 中国大学MOOC-陈越、何钦铭-数据结构-2015秋 01-复杂度2 Maximum Subsequence Sum (25分)

    01-复杂度2 Maximum Subsequence Sum   (25分) Given a sequence of K integers { N​1​​,N​2​​, ..., N​K​​ }. ...

  5. PAT1007:Maximum Subsequence Sum

    1007. Maximum Subsequence Sum (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Y ...

  6. PTA (Advanced Level) 1007 Maximum Subsequence Sum

    Maximum Subsequence Sum Given a sequence of K integers { N​1​​, N​2​​, ..., N​K​​ }. A continuous su ...

  7. 【DP-最大子串和】PAT1007. Maximum Subsequence Sum

    1007. Maximum Subsequence Sum (25) 时间限制 400 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Y ...

  8. PAT Maximum Subsequence Sum[最大子序列和,简单dp]

    1007 Maximum Subsequence Sum (25)(25 分) Given a sequence of K integers { N~1~, N~2~, ..., N~K~ }. A ...

  9. PAT甲 1007. Maximum Subsequence Sum (25) 2016-09-09 22:56 41人阅读 评论(0) 收藏

    1007. Maximum Subsequence Sum (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Y ...

随机推荐

  1. RxJava 设计理念 观察者模式 Observable lambdas MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  2. JQuery巧妙利用CSS操作打印样式

    一.添加打印样式 1. 为屏幕显示和打印分别准备一个css文件,如下所示:  用于屏幕显示的css: <link rel="stylesheet" href="cs ...

  3. sass与less

    刚刚发现sass这个东西,前端真热闹,下面比较一下这两者的共同点与区别. 开头总结一下,方便记忆:sass依赖后端计算能力,less依赖客户端的计算能力. 很多开发者不选择LESS是因为LESS输出修 ...

  4. PCL学习笔记二:Registration (ICP算法)

    原文:http://blog.csdn.net/u010696366/article/details/8941938 PCL Registration API Registration:不断调整,把不 ...

  5. dobbo 服务配置详解(解决超时重试问题)

    <!-- reference method -->     <dubbo:reference interface="com.xx.XxxService">  ...

  6. X86-64寄存器和栈帧

    简介 通用寄存器可用于传送和暂存数据,也可参与算术逻辑运算,并保存运算结果.除此之外,它们还各自具有一些特殊功能.通用寄存器的长度取决于机器字长,汇编语言程序员必须熟悉每个寄存器的一般用途和特殊用途, ...

  7. Exception in thread "main" java.lang.ClassCastException: $Proxy13

    Exception in thread "main" java.lang.ClassCastException: $Proxy13原因:业务层实现了接口 解决:方法一:切面配置事务 ...

  8. DEDE标签综合

    dede: sql标签: sql标签可以称得上是个万能标签了,查询数据库将其输出,这里介绍一些关于这个标签的用法: 1.用来输出统计内容,这个是不错的,举个例子,我们来统计下总共发了多少的文章,思路就 ...

  9. TCP/IP协议族——IP工作原理及实例具体解释(上)

     IP协议具体解释 本文主要介绍了IP服务特点,头部结构,IP分片知识,并用tcpdump抓取数据包.来观察IP数据报传送过程中IP的格式,以及分片的过程. IP头部信息:IP头部信息出如今每一个 ...

  10. Unable to resolve superclass of

    因为用了和Google map相关的类,而Google map是单独的library,需要导入之后才能使用,因此在manifest.xml文件中的<application></app ...