第二章上機實踐報告

2022-08-21 04:48:19 字數 1555 閱讀 3417

1.實踐題目名稱

最大子列和問題

2.問題描述

7-1 最大子列和問題 (20分)

給定k個整數組成的序列,「連續子列」被定義為,其中 1。「最大子列和」則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。

本題旨在測試各種不同的演算法在各種資料情況下的表現。各組測試資料特點如下:

資料1:與樣例等價,測試基本正確性;

資料2:0個隨機整數;

資料3:1個隨機整數;

資料4:20個隨機整數;

資料5:100個隨機整數;

輸入格式:

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

輸出格式:

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

3.演算法描述

演算法採用分治法的思想,將序列段不斷拆分成三部分的子列,求出於中點左邊的最大子列和、右邊的最大子列和以及包含中點在內的最大子列和,通過比較三者的大小,得出符合題意的最大子列和,其關鍵在於將劃分的序列不斷劃分,直至問題的規模足夠小。

**:#include

using namespace std;

int search(int k,int max,int sum,int a)

}  sum=0;

}return max;

}int main()

int might=k/2;

int sum1=0,sum2=0,sum3=a[might];

int max1=a[0],max2=a[might+1],max3=a[might];

max1=search(k,max1,sum1,a);

max2=search(k,max2,sum2,a);

int e=3;

for(int i=might-1;i=0;i-=e)

}e++;

if(sum3>max3)

max3=sum3;

}if(max3>max2&&max3>max1)

coutmax2)

coutmax3)

cout<}

4.演算法時間複雜度分析

設演算法的複雜度為t(n),

分解為兩個子問題為o(1)

分別求解兩個子問題為o(n/2)*2

合併子問題為o(n)

t(n)=o(1)+2t(n/2)+o(n)

t(n)=o(nlogn)

5.心得體會

在初次完成這道題目時,自己寫的**並沒有呼叫遞迴,所以對是否符合分治法思想存有疑惑,但提交測試後是通過的,當時並沒有多想。在後面結對程式設計討論這道題目的時候才發現,並沒有很好的按照題目要求進行程式設計。所以在這次解題之後,對分治的思想有了更好的理解,將大規模的問題劃分為規模足夠小的問題是分治法的主要思想,劃分一兩次並不能體現分治法在效率上的巧妙。

第二章上機實踐報告

題目 2 1 找第k小的數 25分 設計乙個平均時間為o n 的演算法,在n 1 n 1000 個無序的整數中找出第k小的數。輸入有兩行 第一行是n和k,0第二行是n個整數 輸出第k小的數 在這裡給出一組輸入。例如 10 4 2 8 9 0 1 3 6 7 8 2 在這裡給出相應的輸出。例如 2 i...

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

實踐題目名稱 找第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。現要求你編寫程式,計算給定整數序列的最大子列和。本題旨在測試各種不同的演算法在各種資料情況下的表現。各組測試資...