演算法導論第四章 最大子陣列問題

2021-06-26 12:32:45 字數 1538 閱讀 7380

**:

注:(書上的分治演算法複雜度太大,選擇動態規劃演算法)

題目:

輸入乙個整型陣列,資料元素有正數也有負數,求元素組合成連續子陣列之和最大的子陣列,要求時間複雜度為o(n)。

例如:

輸入的陣列為1, -2, 3, 10, -4, 7, 2, -5,最大和的連續子陣列為3, 10, -4, 7, 2,其最大和為18。

分析:

如果不考慮時間複雜度,我們可以列舉出所有子陣列並求出他們的和。不過非常遺憾的是,由於長度為n的陣列有o(n2)個子陣列(即:n + n-1 + ... + 1=n(n+1)/2);而且求乙個長度為n的陣列的和的時間複雜度為o(n)。因此這種思路的時間是o(n3)。

很容易理解,當我們加上乙個正數時,和會增加;當我們加上乙個負數時,和會減少。

如果當前得到的和是個負數,那麼這個和在接下來的累加中應該拋棄並重新清零,不然的話這個負數將會減少接下來的和。基於這樣的思路,我們可以寫出如下**。

#includeusing namespace std;

void maxsum(int array, unsigned int len)

int cursum = 0, maxsum = 0;

int i = 0;

for(i=0; imaxsum)

}if(maxsum == 0)

}} printf("maxsum: %d\n", maxsum);

}int main()

; int n = sizeof(array)/sizeof(array[1]);

maxsum(array,n);

}

**改進:

有時,需要輸出最大和的子陣列及其開始、結束下標,**如下:(**有點小bug就是下標的起始值有時不對)

#includeusing namespace std;

void maxsum(int array, unsigned int len)

int cursum = 0, maxsum = 0;

int index_start = 0, index_end = 0; // 初始化子陣列最大和下標

int i = 0;

for(i=0; imaxsum)

}if(maxsum == 0)

}} // 輸出最大和的子陣列及其開始、結束下標

printf("index_start: %d\nindex_end: %d\n", index_start, index_end);

for(i=index_start; i<=index_end; i++)

printf("\n\nmaxsum: %d\n", maxsum);

}int main()

; int n = sizeof(array)/sizeof(array[0]);

maxsum(array,n);

}

第四章 分治策略 最大子陣列問題

最大子陣列問題 方法一 暴力求解方法 我們可以很容易地設計出乙個暴力方法來求解本問題 簡單地嘗試沒對可能的子陣列,共有o n2 種 includeusing namespace std define int min 0x80000000 int main int i,j int sum 0,maxs...

第四章 陣列

一維陣列的定義 當陣列中每個元素只帶有乙個下標時,我們稱這樣的陣列為一維陣列。陣列的定義格式如下 型別識別符號 陣列名 常量表示式 說明 陣列名的命名規則與變數名的命名規則一致。常量表示式表示陣列元素的個數。可以是常量和符號常量,但不能是變數。例如 int a 10 陣列a定義是合法的 int b ...

工程導論第四章總結

1.創造力的 洗創造力 於想象力,這也是科學巨人愛因斯坦說 想象力比知識更重要 瑟的原因。數百年前達文西是乙個充滿想象力的藝術家 科學家 醫學家及工程師。他早就構思了人類的飛行器,雖然當時的工程技術無法實現該發明,但卻為後來的人們提供了無限的遐想,如今人不們已經把達文西的設計變成了現實。另一方面,達...