演算法導論之最長遞增子串行

2021-06-22 10:33:43 字數 1185 閱讀 6282

習題15.4-5,15.4-6:長度為n的陣列,尋找最長遞增子串行。要求(1)時間複雜度o(n^2) (2)時間複雜度o(n lg n) 

解:可以利用公共子串行來解,將陣列a排序得到a',則a與a'的最大公共子串行即為所求,o(n * n)。下面的兩種方法都是直接基於動態規劃。

設輸入序列為a[1 .. n],以a[i]作為最後乙個元素的最長序列的長度為l[i],則l[i] = max

def findseq(a, l):

seq =

curpos = l.index(max(l))

for i in range(curpos-1, -1, -1):

if l[i] == l[curpos]-1:

curpos = i

seq.insert(0, a[curpos])

return seq

#o(n * n)

def longincreaseseq(a):

l = [0]*len(a)

for i in range(len(a)):

longest = 1

for j in range(i):

if a[j] < a[i] and l[j]+1 > longest:

longest = l[j]+1

l[i] = longest

print l

print findseq(a, l)

return max(l)

#o(n * lg n)

def longincreaseseq_nlgn(a):

inf = max(a)+1

#minend[i] = min

minend = [inf]*len(a)

l = [0]*len(a)

for i in range(len(a)):

j = bisect.bisect_left(minend, a[i])

minend[j] = a[i]

l[i] = j+1;

print findseq(a, l)

return max(l)

a = [random.randint(0, 20) for i in range(15)]

print a

print longincreaseseq(a)

print longincreaseseq_nlgn(a)

演算法導論 最長遞增子串行

華電北風吹 日期 2016 2 20 問題描述 例如陣列arr 1,5,8,2,3,4 的最長遞增子串行是1,2,3,4 動態規劃求解。對於陣列中的每個元素,從前往後計算每個元素的狀態 到這個元素為止所構成的最長遞增子串行。時間複雜度 n2 include include using namespa...

演算法導論15 4 6 最長單調遞增子串行

參考資料 程式設計之美 2.16 題目 給出乙個o nlogn 的演算法,使之能夠找出乙個n個數的序列中最長的單調遞增子串行。o n2 的比較好理解,沒有仔細研究,研究了下o nlogn 的解答和好多大神的分析才明白一些,發現玄妙無限呀 對於序列sn,考慮其長度為i的單調子列 1 i m 我們選取這...

動態規劃之最長遞增子串行

基本歸納法 對於ai 1,只要考察其前乙個狀態ai即可完成整個推理過程,它的特點是只要ai確定,則計算ai 1便不需要考察前序狀態a0.ai 1,我們將這一模型稱之為馬爾科夫模型 高階歸納法 相應的,對於ai 1,考察前i個狀態集才可完成整個推理過程,往往稱之為高階馬爾科夫模型 在計算機演算法中,高...