1. 程式人生 > >最大子列和的四種演算法比較

最大子列和的四種演算法比較

本文將會介紹最大子列和的四種不同複雜度演算法。
演算法一:暴力列舉法,演算法複雜度為O(N三次方)

int maxsequence1(int A[], int N)
{
    int ThisSum , MaxSum=0;
    int i, j, k;
    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; }

演算法二:演算法一的改進,減少一個for迴圈,複雜度為O(N平方)

int maxsequence2(int A[], int N)
{
    int ThisSum, MaxSum = 0;
    int i, j;
    for (i = 0; i <= N; i++) {
        ThisSum = 0;
        for (j = i; j <= N; j++) {
            ThisSum += A[j];
            if
(ThisSum > MaxSum) MaxSum = ThisSum; } } return MaxSum; }

演算法三:分而治之。演算法複雜度為O(NlogN)

int Max(int A, int B, int C)
{
    /*return A > B ? A > C ? A :C: B > C ? B : C;*/
    if (A > B) {
        if (A > C)
            return A;
        else
            return C;
    }
    else
if (B > C) return B; else return C; } int DivideAndConquer(int List[], int left, int right) { int MaxLeftSum, MaxRightSum; int MaxLeftBoardSum, MaxRightBoardSum; int LeftBoardSum, RightBoardSum; int center,i; /*遞迴終止條件*/ if (left == right) { if (List[left] > 0) return List[left]; else return 0; } center = (right + left) / 2; MaxLeftSum = DivideAndConquer(List, left, center); MaxRightSum= DivideAndConquer(List, center+1, right); MaxLeftBoardSum = 0; LeftBoardSum = 0; for (i = center;i >= left; i--) LeftBoardSum += List[i]; if (LeftBoardSum > MaxLeftBoardSum) MaxLeftBoardSum = LeftBoardSum; MaxRightBoardSum = 0; RightBoardSum = 0; for (i = center + 1; i <= right; i++) RightBoardSum += List[i]; if (RightBoardSum > MaxRightBoardSum) MaxRightBoardSum = RightBoardSum; return Max(MaxLeftSum, MaxRightSum, MaxRightBoardSum + MaxLeftBoardSum); } int maxsequence3(int A[], int N) { return DivideAndConquer(A, 0, N-1); }

演算法四:線上處理演算法,程式碼最簡單,且複雜度最低,為O(N)

int maxsequence4(int A[], int N)
{
    int ThisSum,MaxSum ;
    int i;
    ThisSum = MaxSum = 0;
    for (i = 0; i <= N; i++) {
        ThisSum += A[i];
        if (ThisSum > MaxSum)
            MaxSum = ThisSum;
        else if (ThisSum < 0)
            ThisSum = 0;
    }
    return MaxSum;


}

主程式如下

#include <stdio.h>
int maxsequence1(int A[], int N);
int maxsequence2(int A[], int N);
int maxsequence3(int A[], int N);
int maxsequence4(int A[], int N);
int main(void)
{
    int K,j=0;
    int a,max;
    int num[100000];
        printf("請輸入數字個數:\n");
        scanf("%d", &K);
        printf("請輸入%d個數字\n", K);
        for (a = 0; a < K; a++) {
            scanf("%d", &num[a]);
            if (num[a] < 0)
                j++;
        }
        if (j == K)
            printf("0\n");
        else {
            /*用哪個選哪個*/
            max = maxsequence1(num, K);
            max = maxsequence2(num, K);
            max = maxsequence3(num, K);
            max = maxsequence4(num, K);
            printf("最大子列和為:%d\n", max);
        }

}

以上即為求最大子列和的四種演算法。

相關推薦

大子求法

給定n(1<=n<=100000)個整數(可能為負數)組成的序列a[1],a[2],a[3],…,a[n],求該序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。當所給的整數均為負數時定義子段和為0,依此定義,所求的最優值為: Max{0,a[i]+a

大子演算法比較

本文將會介紹最大子列和的四種不同複雜度演算法。 演算法一:暴力列舉法,演算法複雜度為O(N三次方) int maxsequence1(int A[], int N) { int ThisSum , MaxSum=0; int i, j,

大子演算法總結

最大子列和問題描述: 給定一串整數列中,求滿足子列和最大,並返回最大值。例如(2, -1, 6, 8, -5, 7, -11),其中的滿足和最大的子列為(2, -1, 6, 8, -5, 7),最大值為17。 演算法一 最蠢的方法是列舉法,把所有的子列都跑

數據結構(一)-----4方法求大子

include iss 需要 中間 () log 完整 font sso 數據結構(一)-----4種方法求最大子列和 1、暴力算法 /* 作者:mys 功能:求最大子列和 日期:2018/7/23 */ #include<stdio.h> #include&l

演算法學習——大子問題

參考視訊: 中國大學mooc——浙江大學——資料結構——陳越、何欽銘 問題描述: 求取陣列中最大連續子序列和,例如給定陣列為A={1, 3, -2, 4, -5}, 則最大連續子序列和為6,即1+3+(-2)+ 4 = 6。 演算法一 int MaxSubseqSu

大子問題3解法C語言

演算法1 找出所有的子列和,返回最大的 int MaxSubseqSum1(int str[],int n) //時間複雜度為O(n*2) { int maxsum=0; for(int i=0;i<n;i++){ int sum=0; for(int j=i;j

線上處理演算法 | HDU 1003 Max Sum 大子

Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 299181    Accepted Submission(s)

PTA資料結構與演算法題目集(中文)5-1 大子問題 (20分)

給定KK個整陣列成的序列{ N_1N​1​​, N_2N​2​​, ..., N_KN​K​​ },“連續子列”被定義為{ N_iN​i​​, N_{i+1}N​i+1​​, ..., N_jN​j​​ },其中 1 \le i \le j \le K1≤i≤j≤

PTA 資料結構題目(1):大子問題(分而治之、線上處理演算法

題目來源: 問題描述: 問題分析: 對於一般的問題,原始解 都能通過一種 蠻力演算法,即窮舉法的思想得到。這題也不例外。 如果我們,把輸入的陣列,所有的子列都歷遍,並從中找出最大,即可得出我們的演算法。也就是版本一。 學習要點: 1、如何

演算法筆記-1-大子-Maximum Subsequence Sum

題目內容: Given a sequence of KK integers {N1,N2,...,NK}. A continuous subsequence is defined to be {Ni,Ni+1,...,Nj} where 1≤i≤j≤K1

應用實例——大子問題

[] str else -s 給定 復雜 lin wid 工作流 題目描述:給定N個整數的序列{A1,A2,...,AN},求函數f(i,j)=max{0,ΣAk(i<=k<=j)}的最大值 算法1: 1 int MaxSubseqSum1(int A[],

大子(在線處理,復雜度O(n))

spa 最大子列和 pts 最大 int nts ups script 程序 #include<stdio.h> int main(){ int k,num,sum=0,Max=0; scanf("%d",&k); while(k--){ s

資料結構之大子

#include <stdlib.h> #include <stdio.h> int MaxSubseqSum(int a[],int N) {     int i,ThisSum = 0,MaxSum = 0;    &nb

PATtest1.3:大子

題目源於:https://pintia.cn/problem-sets/16/problems/663 題目要求:輸入一個數列,求其最大子列和。   問題反饋:1.部分C++程式碼不是很熟練               &

大子

int MaxSubSeqSum(int arr[], int n) { int currentSum, maxSum; currentSum = maxSum = 0; for(int i=0; i<n; i++) { curr

大子 – 線上處理

#最大子列和 – 線上處理 01-複雜度2 Maximum Subsequence Sum (25 分) The Maximum Subsequence is the continuous subsequence which has the largest sum of its elem

基礎數據結構應用——大子問題

pan nts -h 不同 ... printf fine () script 給定K個整數組成的序列{ N?1??, N?2??, ..., N?K?? },“連續子列”被定義為{ N?i??, N?i+1??, ..., N?j?? },其中 1。“最大子列和”則被定義

hdu1003Maxsum(大子問題)

這道題開始一直是Time Limit Exceeded,後來改動了又Wrong Answer,然後就是Presentation Error,改著改著終於AC了 題目連結:hdu1003 這是一道動態規劃的題目,即求最大子序列和:給定一列數a[1],a[2].....a[n],求a[i]+..

7-1 大子問題 (20 分)

給定K個整陣列成的序列{ N​1​​, N​2​​, …, N​K​​ },“連續子列”被定義為{ N​i​​, N​i+1​​, …, N​j​​ },其中 1≤i≤j≤K。“最大子列和”則被定義為所有連續子列元素的和中最大者。例如給定序列{ -2, 11,

大子(時間複雜度)程式碼實現及結果對比

題目:給定N個整數的序列{A1,A2,A3...ANA_1,A_2,A_3...A_NA1​,A2​,A3​...AN​}, 求函式f(i,j)=max(0,Σk=1jAk)f(i,j)=max(0,\Sigma_{k=1}^jA_k)f(i,j)=max(0,