九天雁翎的博客
如果你想在软件业获得成功,就使用你知道的最强大的语言,用它解决你知道的最难的问题,并且等待竞争对手的经理做出自甘平庸的选择。 -- Paul Graham

一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(3) 最大子序列和问题

 

 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(3
最大子序列和问题

write by 九天雁翎(JTianLing) --
blog.csdn.net/vagrxie

 

<<Data Structures and Algorithm Analysis in C++>>

--《数据结构与算法分析c++描述》 Mark Allen Weiss 人民邮电大学出版 中文版第39-43面,图2-52-6,2-7,2-8最大子序列和问题的解

总算有点技术含量了,呵呵,虽然说重复实现一下代码不难(不就是相当于翻译嘛),但是算法4为什么是正确的需要好好理解一下。

以下为实现部分:

CPP:

  1
//
  2 //
Maximum contiguous subsequence sum algorithm 1 - 4, worst to best

  3 //
From <<Data Structures and Algorithm Analysis in C++>> by Mark
Allen Weiss

  4 //
  5 //
  6 #include
<stdio.h>
  7 #include
<stdlib.h>
  8 #include
<vector>
  9 using namespace std;
 10
 11
 12
 13 int maxSubSum1(
const vector<int> &a)
 14 {
 15     int maxSum = 0;
 16
 17     for(int i=0; i<(int)a.size();
++i)
 18         for(int j=i;
j<(int)a.size(); ++j)
 19         {
 20             int thisSum = 0;
 21
 22             for(int k=i;
k<=j; ++k)
 23                 thisSum
+= a[k];
 24
 25             if(thisSum > maxSum)
 26                 maxSum
= thisSum;
 27         }
 28     return maxSum;
 29 }
 30
 31 int maxSubSum2(
const vector<int> &a)
 32 {
 33     int maxSum = 0;
 34
 35     for(int i=0; i<(int)a.size();
++i)
 36     {
 37         int thisSum = 0;
 38         for(int j=i;
j<(int)a.size(); ++j)
 39         {
 40             thisSum
+= a[j];
 41
 42             if( thisSum > maxSum)
 43                 maxSum
= thisSum;
 44         }
 45     }
 46     return maxSum;
 47 }
 48
 49 int max3(int a, int b,
int c)
 50 {
 51     return ((a < b)?((b < c)?c:b):((a
< c)?c:a));
 52 }
 53
 54
 55 int maxSumRec(
const vector<int> &a, int left,
int right)
 56 {
 57     if(left == right)
 58         if( a[left] > 0)
 59             return a[left];
 60         else
 61             return 0;
 62
 63     int center = (left + right) / 2;
 64     int maxLeftSum = maxSumRec(a, left,
center);
 65     int maxRightSum = maxSumRec(a, center + 1, right);
 66
 67     int maxLeftBorderSum = 0;
 68     int leftBorderSum = 0;
 69
 70     for(int i=center;
i >=left; --i)
 71     {
 72         leftBorderSum
+= a[i];
 73         if(leftBorderSum > maxLeftBorderSum)
 74             maxLeftBorderSum
= leftBorderSum;
 75     }
 76
 77     int maxRightBorderSum = 0,rightBorderSum = 0;
 78     for(int j
= center + 1; j <= right; ++j)
 79     {
 80         rightBorderSum
+= a[j];
 81         if(rightBorderSum > maxRightBorderSum)
 82             maxRightBorderSum
= rightBorderSum;
 83     }
 84
 85     
 86     return max3(maxLeftSum, maxRightSum,
maxLeftBorderSum + maxRightBorderSum);
 87 }
 88
 89 int maxSubSum3(const vector<int> &a)
 90 {
 91     return maxSumRec(a, 0, a.size() - 1);
 92 }
 93
 94 int maxSubSum4(
const vector<int> &a)
 95 {
 96     int maxSum = 0,
thisSum = 0;
 97
 98     for( int j
= 0; j< (int)a.size();
++j)
 99     {
100         thisSum
+= a[j];
101
102         if(thisSum > maxSum)
103             maxSum
= thisSum;
104         else if(thisSum
< 0)
105             thisSum

= 0;
106     }
107
108     return maxSum;
109 }
110
111
112
113 int main(int argc, char*
argv[])
114 {
115     // for easy
116     int a[] = { -2,
11, -4, 13, -5, -2};
117     vector<int> lvec(a, a + sizeof(a)/sizeof(int));
118
119     printf("maxSubSum1(lvec)):%d/n",maxSubSum1(lvec));
120     printf("maxSubSum2(lvec)):%d/n",maxSubSum2(lvec));
121     printf("maxSubSum3(lvec)):%d/n",maxSubSum3(lvec));
122     printf("maxSubSum4(lvec)):%d/n",maxSubSum4(lvec));
123
124
125     exit(0);
126 }
127

LUA:

  1
#!/usr/bin/env
lua

  2
  3
  4 function maxSubSum1(a)
  5     assert(type(a) == "table", "Argument
a must be a number array."
)
  6
  7     local maxSum = 0
  8
  9     for i=1,#a
do
 10         for j=i,#a    do
 11             local thisSum = 0
 12             for k=i,j do
 13                 thisSum
= thisSum + a[k]
 14             end
 15
 16             if thisSum > maxSum then
 17                 maxSum
= thisSum
 18             end
 19         end
 20     end
 21
 22     return maxSum
 23 end
 24
 25 function maxSubSum2(a)
 26     assert(type(a) == "table", "Argument
a must be a number array."
)
 27
 28     local maxSum = 0
 29
 30     for i=1,#a
do
 31         local thisSum = 0
 32
 33         for j=i,#a do
 34             thisSum
= thisSum + a[j]
 35
 36             if(thisSum > maxSum) then
 37                 maxSum
= thisSum
 38             end
 39         end
 40     end
 41     return maxSum
 42 end
 43
 44 function max3(n1,
n2, n3)
 45     return (n1 > n2 and ((n1 > n3) and n1 or n3)
or ((n2 > n3) and n2 or n3))
 46 end
 47
 48 -- require
math

 49
 50 function maxSumRec(a,
left, right)
 51     assert(type(a) == "table", "Argument
a must be a number array."
)
 52     assert(type(left) == "number" and type(right) == "number",
 53             "Argument left&right  must be number
arrays."
)
 54
 55     if left == right then
 56         if a[left] > 0 then
 57             return a[left]
 58         else
 59             return 0
 60         end
 61     end
 62
 63     local center = math.floor((left
+ right) / 2)
 64     local maxLeftSum = maxSumRec(a, left,
center)
 65     local maxRightSum = maxSumRec(a, center+1, right)
 66
 67     local maxLeftBorderSum = 0
 68     local leftBorderSum = 0
 69     for i=center,left,-1 do
 70         leftBorderSum
= leftBorderSum + a[i]
 71         if leftBorderSum > maxLeftBorderSum then
 72             maxLeftBorderSum
= leftBorderSum
 73         end
 74         i
= i - 1
 75     end
 76
 77     local maxRightBorderSum = 0
 78     local rightBorderSum = 0
 79     for j=center+1,right
do
 80         rightBorderSum
= rightBorderSum + a[j]
 81         if rightBorderSum > maxRightBorderSum then
 82             maxRightBorderSum
= rightBorderSum
 83         end
 84     end
 85
 86     return max3(maxLeftSum, maxRightSum,
maxLeftBorderSum + maxRightBorderSum)
 87 end
 88
 89 function maxSubSum3(a)
 90     assert(type(a) == "table", "Argument
a must be a number array."
)
 91
 92     return maxSumRec(a, 1, 6)
 93
 94 end
 95
 96 function maxSubSum4(a)
 97     assert(type(a) == "table", "Argument
a must be a number array."
)
 98
 99     local maxSum = 0
100     local thisSum = 0
101
102     for i=1,#a
do
103         thisSum
= thisSum + a[i]
104
105         if thisSum > maxSum then
106             maxSum
= thisSum
107         elseif thisSum < 0 then
108             thisSum
= 0
109         end
110
111     end
112
113     return maxSum
114
115 end
116
117 -- Test Code
118
119 t = {-2, 11, -4, 13, -5, -2 }
120
121 print("maxSubSum1(t):" .. maxSubSum1(t))
122 print("maxSubSum2(t):" .. maxSubSum2(t))
123 print("maxSubSum3(t):" .. maxSubSum3(t))
124 print("maxSubSum4(t):" .. maxSubSum4(t))
125
126
127

PYTHON:

 1
#!/usr/bin/env
python

 2
 3 # How Short
and Clean it is I shocked as a CPP Programmer

 4 def maxSubSum1(a):
 5     maxSum = 0
 6
 7     for i in a:
 8         for j in a[i:]:
 9             thisSum
= 0
10
11             for k in a[i:j]:
12                 thisSum
+= k
13
14             if thisSum > maxSum:
15                 maxSum
= thisSum
16     
17     return maxSum
18
19 def maxSubSum2(a):
20     maxSum = 0
21
22     for i in a:
23         thisSum
= 0
24         for j in a[i:]:
25             thisSum
+= j
26
27             if thisSum > maxSum:
28                 maxSum
= thisSum
29
30     return maxSum
31
32
33 def max3(n1,
n2, n3):
34     return ((n1 if n1
> n3 else n3) if n1 > n2 else (n2
if n2 > n3 else n3))
35
36 def maxSumRec(a,
left, right):
37     if left == right:
38         if  a[left] > 0:
39             return a[left]
40         else:
41             return 0
42
43     center = (left +
right)//2
44     maxLeftSum =
maxSumRec(a, left, center)
45     maxRightSum =
maxSumRec(a, center+1, right)
46
47     maxLeftBorderSum
= 0
48     leftBorderSum = 0
49     for i in a[center:left:-1]:
50         leftBorderSum
+= i
51         if leftBorderSum > maxLeftBorderSum:
52             maxLeftBorderSum
= leftBorderSum
53
54     maxRightBorderSum
= 0
55     rightBorderSum =
0
56     for i in a[center+1:right]:
57         rightBorderSum
+= i
58         if rightBorderSum > maxRightBorderSum:
59             maxRightBorderSum
= rightBorderSum
60     
61     return max3(maxLeftSum,
maxRightBorderSum, maxLeftBorderSum + maxRightBorderSum)
62
63 def maxSubSum3(a):
64     return maxSumRec(a, 0,
len(a)-1    )
65
66 def maxSubSum4(a):
67     maxSum = 0
68     thisSum = 0
69
70     for i in a:
71         thisSum
+= i
72
73         if thisSum > maxSum:
74             maxSum
= thisSum
75         elif thisSum < 0:
76             thisSum
= 0
77
78     return maxSum
79             
80 def test():
81     t = (-2, 11, -4,
13, -5, -2)
82
83     print "maxSubSum1:%d" %
maxSubSum1(t)
84     print "maxSubSum2:%d" %
maxSubSum2(t)
85     print "maxSubSum3:%d" %
maxSubSum3(t)
86     print "maxSubSum4:%d" %
maxSubSum4(t)
87
88 if __name__ == '__main__':
89     test()

BASH:

1 #!/usr/bin/env bash
2
绕了我吧。。。。。特别是算法二。。复杂的递归用bash来写就是自虐。Bash似乎本来就不是用来描述算法用的,呵呵,以后没有什么事一般就不把bash搬出来了。

 

 

 

write by 九天雁翎(JTianLing) -- www.jtianling.com

 

分类:  Lua  Python  算法 
标签:  Bash  C++  Lua  Python  《数据结构与算法分析-C++描述》 

Posted By 九天雁翎 at 九天雁翎的博客 on 2008年11月23日

前一篇: Windows中多指针输入技术的实现与应用(10 双鼠标五子棋源代码 全系列完) 后一篇: 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(4)二分搜索算法