實現最大子串行,其主要需要注意的是』連續』一詞。
然而我在檢視《演算法導論》書本時,發現**本身無問題,同樣的遞迴**在c++中是可以正常執行的,在python當中卻無法正常執行,需要新增哨兵才可以正常的使用。
注:**本身無問題
上**:
#coding=utf-8
class
infotype:
def__init__
(self, leftpos, rightpos, value):
self.__leftpos = leftpos
self.__rightpos = rightpos
self.__value = value
defgetleftpos
(self):
return self.__leftpos
defgetrightpos
(self):
return self.__rightpos
defgetvalue
(self):
return self.__value
def__str__
(self):
return
', , '. format(self.getleftpos(), self.getrightpos(), self.getvalue())
deffindmaxcrossingsubarray
(array, low, mid, high):
leftsum = -100000000
maxleftpos = 0
maxsum = 0
for i in range(mid, low, -1):
maxsum = maxsum + array[i]
if maxsum > leftsum:
leftsum = maxsum
maxleftpos = i
#print(leftsum, maxsum, i)
rightsum = -100000000
maxrightpos = 0
maxsum = 0
for i in range(mid + 1, high):
maxsum = maxsum + array[i]
if maxsum > rightsum:
rightsum = maxsum
maxrightpos = i
return infotype(maxleftpos, maxrightpos, leftsum + rightsum)
deffindmaximumsubarray
(array, low, high):
if low == high:
return infotype(low, high, array[low])
mid = (low + high) // 2
leftmaxsubarray = findmaximumsubarray(array, low, mid)
rightmaxsubarray = findmaximumsubarray(array, mid + 1, high)
midmaxsubarray = findmaxcrossingsubarray(array, low, mid, high)
if leftmaxsubarray.getvalue() >= rightmaxsubarray.getvalue() and \
leftmaxsubarray.getvalue() >= midmaxsubarray.getvalue():
return leftmaxsubarray
elif rightmaxsubarray.getvalue() >= leftmaxsubarray.getvalue() and \
rightmaxsubarray.getvalue() >= midmaxsubarray.getvalue():
return rightmaxsubarray
else:
return midmaxsubarray
if __name__ == '__main__':
import sys
sys.setrecursionlimit(1000)
a = [0, 4, 1, 5, 7, 3, 9, 11, 2, 6, 3, 7, 0]
result = findmaximumsubarray(a, 0, len(a) - 1)
print(result)
ps:兩頭的』0』為哨兵。 用python學習資料結構與演算法 堆疊
堆疊 堆疊 stack 是一種後進先出 lifo 的線性資料結構,對堆疊的插入和刪除操作都只能在棧頂 top 進行。棧和佇列主要用於計算過程中儲存臨時資料。堆疊 adt 抽象資料型別 一般提供以下介面 stack 建立堆疊 push item 向棧頂插入項 pop 返回棧頂的項,並從堆疊中刪除該項 ...
用Python 學習資料結構與演算法 三 選擇排序
選擇排序是將陣列從開始按順序找出相應位置上合適的元素,到達n位置時則不用再尋找該位置元素,因為這時所有元素已經就位。上 coding utf 8 defselectsort array i 0 只用選n 1個數進行排序,因為選到最後第n個數是不用排序的 for x in range 0,len ar...
用Python 學習資料結構與演算法 四 歸併排序
歸併排序主要的過程是將大陣列拆分為小陣列,再將小陣列問題解決,然後歸併處理組成新無問題的陣列再次歸併。上 coding utf 8 歸併運算 array 陣列 lpos 左座標 mpos 中座標 rpos 右座標 defmerge array,lpos,mpos,rpos 切片左右陣列 leftar...