求連續子序列最大和的問題是一個很有趣的問題,我們在學習程序語言時經常會做一些這樣的練習。這個之所以有趣,是因為有很多算法可以解決它,而這些算法的性能又相差很。下面給出用boo語言實現的三種解決方法:
1、最簡單的方法就是直接窮盡查找,即遍歷所有可能的子序列,對每一個可能的子序列,計算出它們的和,最後返回最大的和。
求連續子序列最大和的問題是一個很有趣的問題,我們在學習程序語言時經常會做一些這樣的練習。這個之所以有趣,是因為有很多算法可以解決它,而這些算法的性能又相差很。下面給出用boo語言實現的三種解決方法:
1、最簡單的方法就是直接窮盡查找,即遍歷所有可能的子序列,對每一個可能的子序列,計算出它們的和,最後返回最大的和。
01 import System
02 def maxSubsequenceSum1(*args as (int)):
03 maxSum = 0
04 for i in range(args.Length):
05 for j in range(i, args.Length):
06 thisSum = 0
07 for k in range(i, j):
08 thisSum += args[k]
09 if thisSum > maxSum:
10 maxSum = thisSum
11 seqStart = i
12 seqEnd = j
13
14 return maxSum
02 def maxSubsequenceSum1(*args as (int)):
03 maxSum = 0
04 for i in range(args.Length):
05 for j in range(i, args.Length):
06 thisSum = 0
07 for k in range(i, j):
08 thisSum += args[k]
09 if thisSum > maxSum:
10 maxSum = thisSum
11 seqStart = i
12 seqEnd = j
13
14 return maxSum
這個方法的優點就是極其簡單,然而通常這種算法效率卻不是很好。
2、如果我們從上面的方法中刪除一個循環,就可以降低這個算法的運行時間。通過觀察可以看到上面的算法有很多不必要的計算,我們可以將內層的for循環去掉,以提高效率。
01 import System
02 def maxSubsequenceSum2(*args as (int)):
03 maxSum = 0
04 for i in range(args.Length):
05 thisSum = 0
06 for j in range(i, args.Length):
07 thisSum += args[j]
08 if thisSum > maxSum:
09 maxSum = thisSum
10 seqStart = i
11 seqEnd = j
12
13 return maxSum
02 def maxSubsequenceSum2(*args as (int)):
03 maxSum = 0
04 for i in range(args.Length):
05 thisSum = 0
06 for j in range(i, args.Length):
07 thisSum += args[j]
08 if thisSum > maxSum:
09 maxSum = thisSum
10 seqStart = i
11 seqEnd = j
12
13 return maxSum
3、可以看出第二個算法的效率與第一個相比,已經提高很多了,但第二個算法還是窮盡查找,也就是說,我們還是測試了所有可能的子序列。我們可以從中排除很多不可能的子序列。下面我給出第三個算法的實現代碼,對於這個算法的正確性,可以通過數學推理去證明。
01 import System
02 def maxSubsequenceSum3(*args as (int)):
03 maxSum = 0
04 thisSum = 0
05 for j in range(args.Length):
06 i = 0
07 thisSum += args[j]
08 if thisSum > maxSum:
09 maxSum = thisSum
10 seqStart = i
11 seqEnd = j
12 elif thisSum < 0:
13 i = j + 1
14 thisSum = 0
15
16 return maxSum
02 def maxSubsequenceSum3(*args as (int)):
03 maxSum = 0
04 thisSum = 0
05 for j in range(args.Length):
06 i = 0
07 thisSum += args[j]
08 if thisSum > maxSum:
09 maxSum = thisSum
10 seqStart = i
11 seqEnd = j
12 elif thisSum < 0:
13 i = j + 1
14 thisSum = 0
15
16 return maxSum