zoukankan      html  css  js  c++  java
  • 【编程珠玑】读书笔记 第八章 算法设计艺术

    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]<<"	";
     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
    请按任意键继续. . .
  • 相关阅读:
    xxx
    04消息队列zmq的发布者-订阅者的计算π的简单程序。
    03网络编程从之异步服务器
    03Python网络编程之多线程服务端。
    03Python网络编程之单线程服务端
    03Python网络编程之客户端。
    03Python网络编程系列之服务端
    02select监听客户端
    02select监听服务端
    07爬虫之-urllib总结
  • 原文地址:https://www.cnblogs.com/youngforever/p/3189871.html
Copyright © 2011-2022 走看看