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

2022-07-14 09:12:12 字數 1105 閱讀 3746

1,實踐題目名稱

最大子列和問題

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

輸入格式:

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

輸出格式:

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

輸入樣例:

6 -2 11 -4 13 -5 -2

輸出樣例:

20

採用分治法,將原問題分成相同結構的子問題,進行遞迴求出最佳答案,再將子問題的解合併,得到原問題的答案。

本道題當中將序列從中間分開,分成左半邊序列和右半邊序列。遞迴計算左段最大子段和leftmax,右段最大子段和rightmax。

s1為左邊left至middle的最大和,從middle開始逐個往左累加,重新整理最大和;s2為middle+1至right邊界的最大和,從middle+1開始逐個往右累加,重新整理最大和;s3為橫跨左右兩段的最大和。

最後比較以上三個資料,取最大值作為最大子段和

分治法 計算左右兩邊的子段最大值再合併時間複雜度 o(nlogn)

分治法:拆分問題  把原規模為n的問題以middle為中心 拆分成兩部分  t(n)= o(1);求解子問題:從middle開始往left累加,得到最大和:時間為o(n),右半邊也是o(n)合併子問題:t(n)=  2t(n/2)+ o(n)。通過計算得出:t(n)=  o(nlogn)

本次程式設計在考慮情況方面沒有全面,只考慮了最大值是橫跨左右的,沒有考慮到只存在於左端或者右端的情況,再加上pta上給的測試資料和測試點的問題,我們**能夠過,但是其實是不對的。希望在之後的程式設計中考慮完整的情況。

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

實踐題目名稱 找第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.實踐題目 7 2 改寫二分搜尋演算法 20 分 設a 0 n 1 是已排好序的陣列,請改寫二分搜尋演算法,使得當x不在陣列中時,返回小於x的最大元素位置i和大於x的最小元素位置j。當搜尋元素在陣列中時,i和j相同,均為x在陣列中的位置。輸入有兩行 第一行是n值和x值 第二行是n個不相同的整數組成...