【编程珠玑】读书笔记 第八章 算法设计艺术
2013-07-14 16:36:02
本章通过一个实例,展示了算法设计艺术,展示了一些算法设计的常用技术。
问题描述:
输入是具有n个浮点数的向量x,求输入向量的任何连续子向量中的最大和。
下面给出三种实现方法的代码,以及测试结果。
代码:
1 #include <iostream> 2 #include <cassert> 3 using namespace std; 4 const int SIZE = 100; 5 6 //最直观的解法,时间复杂度为O(n^3) 7 int GetMaxSumBasic(const int array[],const int len) 8 { 9 int currentSum = 0; 10 int maxSum = 0; 11 int i; 12 int j; 13 int k; 14 15 assert(array != NULL && len >= 0); 16 17 for (i = 0;i < len;++i) 18 { 19 for (j = i;j < len;++j) 20 { 21 currentSum = 0; 22 23 for(k = i;k <= j;++k) 24 { 25 currentSum = currentSum + array[k]; 26 } 27 28 maxSum = maxSum > currentSum ? maxSum : currentSum; //更新最大和 29 } 30 } 31 32 return maxSum; 33 } 34 35 //最直观解法的改进,时间复杂度为O(n^2) 36 int GetMaxSumImproved(const int array[],const int len) 37 { 38 int currentSum = 0; 39 int maxSum = 0; 40 int i; 41 int j; 42 43 assert(array != NULL && len >= 0); 44 45 for (i = 0;i < len;++i) 46 { 47 currentSum = 0; 48 for (j = i;j < len;++j) 49 { 50 currentSum = currentSum + array[j]; 51 maxSum = maxSum > currentSum ? maxSum : currentSum; //更新最大和 52 } 53 } 54 55 return maxSum; 56 } 57 58 //有技巧性的解法保存时间复杂度为O(n) 59 int GetMaxSumAdvaced(const int array[],const int len) 60 { 61 int currentSum = 0; 62 int maxSum = 0; 63 int i; 64 65 assert(array != NULL && len >= 0); 66 67 for (i = 0;i < len;++i) 68 { 69 currentSum = currentSum + array[i]; 70 currentSum = (currentSum < 0) ? 0 : currentSum; //若当前小于0,则置为0 71 maxSum = maxSum > currentSum ? maxSum : currentSum; //更新最大和 72 } 73 74 return maxSum; 75 } 76 77 //显示数组元素 78 void DisplayArray(const int array[],const int len) 79 { 80 assert(array != NULL && len >= 0); 81 for (int i = 0;i < len;++i) 82 { 83 cout<<array[i]<<"\t"; 84 } 85 cout<<endl; 86 } 87 88 //测试程序 89 int main(void) 90 { 91 int array[SIZE]; 92 int data; 93 int len = 0; 94 95 //input array 96 cout<<"please enter the data of the array,end with ctrl+z : "<<endl; 97 while (cin >> data) 98 { 99 array[len++] = data; 100 } 101 102 cout<<"display the array :"<<endl; 103 DisplayArray(array,len); 104 105 //test GetMaxSumBasic 106 cout<<"test GetMaxSumBasic..."<<endl; 107 cout<<"the max sum is : "<<GetMaxSumBasic(array,len)<<endl; 108 109 //test GetMaxSumImproved 110 cout<<"test GetMaxSumImproved..."<<endl; 111 cout<<"the max sum is : "<<GetMaxSumImproved(array,len)<<endl; 112 113 //test GetMaxSumAdvaced 114 cout<<"test GetMaxSumAdvaced..."<<endl; 115 cout<<"the max sum is : "<<GetMaxSumAdvaced(array,len)<<endl; 116 117 return 0; 118 }
测试结果:
please enter the data of the array,end with ctrl+z : 31 -41 59 26 -53 58 97 -93 -23 84 ^Z display the array : 31 -41 59 26 -53 58 97 -93 -23 84 test GetMaxSumBasic... the max sum is : 187 test GetMaxSumImproved... the max sum is : 187 test GetMaxSumAdvaced... the max sum is : 187 请按任意键继续. . .
测试二:
please enter the data of the array,end with ctrl+z : -23 24 -1 35 -28 67 -21 10 ^Z display the array : -23 24 -1 35 -28 67 -21 10 test GetMaxSumBasic... the max sum is : 97 test GetMaxSumImproved... the max sum is : 97 test GetMaxSumAdvaced... the max sum is : 97 请按任意键继续. . .