演算法第二章上機實踐報告

2022-08-21 05:09:14 字數 1214 閱讀 5476

1.實踐題目名稱:最大子列和問題

2.問題描述:給定k個整數組成的序列,「連續子列」被定義為,其中 1≤i≤j≤k。「最大子列和」則被定義為所有連續子列元素的和中最大者。

3.演算法描述:

maxsum函式:首先將k個正整數分成兩半,先判斷只有乙個元素的情況;其次開始分別查詢左右兩邊最大的乙個數,查詢完之後開始比較大小,求得最大子列和並返回具體數值大小。

mmax = mmax1+mmax2;

if(mmax1 mmax1 =mmax2;

return mmax1 > mmax ? mmax1 : mmax;

完整函式**:

int maxsum(int* a, int left, int

right)

else

int sum2 = 0

;

int mmax2 = 0

;

for(int i = mid+1; i<=right; i++)

mmax = mmax1+mmax2;

if(mmax1 mmax1 =mmax2;

return mmax1 > mmax ?mmax1 : mmax;

}}

主函式:

輸入格式:輸入第1行給出正整數k (≤100000);第2行給出k個整數,其間以空格分隔

輸出格式:在一行中輸出最大子列和。如果序列中所有整數皆為負數,則輸出0。

int

main()

4.演算法時間及空間複雜度分析(要有分析過程)

原問題分解成子問題,原本為o(n),分一半為o(n/2),執行一次for迴圈為o(n),所以時間複雜度為o(nlogn);空間複雜度為o(n)。

5.心得體會(對本次實踐收穫及疑惑進行總結)

首先本次實踐讓我從我的搭檔那裡學到很多東西,包括學習怎樣思考、怎樣由題目總結出對應的**表示出來,這道題我們提交了很多次,輸出錯誤了很多次,第一次是邊界條件:

int lmax =maxsum(a, left, mid);

int rmax = maxsum(a, mid+1, right);

我們一開始下面那行寫的還是mid導致出錯,在老師的提醒下我們及時改正過來。第二次是在最大值的判斷那裡,因為變數太多導致我們總是打錯,我覺得要及時做好標記才能在後面檢查的時候更好的發現錯誤等等......

演算法第二章上機實踐報告

實踐題目名稱 找第k個小的數 問題描述 設計乙個平均時間為o n 的演算法,在n 1 n 1000 個無序的整數中找出第k小的數。演算法描述 就是先假設a left 為這個分界值x,然後排序。比較x是不是第k個如果是,返回這個值。如果不是比較一下x和a k 的大小,如果xa k 遞迴在x的右邊找 演...

演算法第二章上機實踐報告

7 1 最大子列和問題 20分 給定k個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。本題旨在測試各種不同的演算法在各種資料情況下的表現。各組測試資...

演算法第二章上機實踐報告

1,實踐題目名稱 最大子列和問題 給定k個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。本題旨在測試各種不同的演算法在各種資料情況下的表現。各組測試...