演算法複雜度分析與最大子串問題

2021-09-21 06:04:05 字數 1502 閱讀 1230

演算法複雜度分析基於以下四條定義:

若使用比較簡單(不甚準確)的表達:

時間估算中,認為每個操作花費時間為1,跳轉,判斷等所消耗時間可以忽略,例如

for(i = 0;i < n;i++)   

b += i;

}

分析以上演算法,內迴圈一次耗時n,外迴圈一次耗時$n * (n + 1) = n^ + n$,時間估算中忽略常數項和低次項,該演算法花費時間$o(n^)$,由以上可以得出一些結論:

已知乙個序列,要求求和最大的連續子串行的和。例如輸入-2,11,-4,13,-5,-2,輸出20(11-4+13)

考慮最簡單直接的解法,計算出以某個數開頭的所有子串行和,取出最大的值

func solution1(data int, num int) int 

if this_sum > max_sum }}

return max_sum

} //done: 1.1903458s

考慮以上求和的部分,每改乙個j(結尾位置)都要重新計算全部子串行和。其實前面的和是被重複計算了,計算下乙個子串行和時只需要加上結尾的值就可以了。

func solution2(data int) int }}

return max_sum

} // done: 1.115286s

分治法解決這個問題的方法是:找出左側一半的最大子串,找出右側一半的最大子串,找出跨越左右分界的最大子串(左側終點確定,右側起點確定),比較得最大值。

func solution3(data int) int 

split_num := int(len(data) / 2)

// fmt.println(split_num)

left_max := solution3(data[:split_num])

right_max := solution3(data[split_num:])

mid_left_max, mid_right_max := 0, 0

mid_left, mid_right := 0, 0

for i := split_num; i >= 0; i--

}for i := split_num + 1; i < len(data); i++

}mid_max := mid_left_max + mid_right_max

if (mid_max > left_max) && (mid_max > right_max) else if left_max > right_max else

} //done: 1.1223139s

該演算法原理還未理解透徹,正在研究中

func solution4(data int) int  else if this_sum > max_sum 

}return max_sum

} //done: 1.1323284s

最大子列和(演算法複雜度優化)

include include include define maxk 1e7 clock t start,stop double duration 一種複雜度為o n 3 的暴力解法 int maxsubseqsum1 int a,int n return maxsum 複雜度為o n 2 的演算...

最大子串行和O(n)階複雜度演算法

問題描述給定整數序列a1,a2,a3,a4,a5,求 ai a i 1 aj 的最大值 int mostson int arryin,int len else return most 演算法解釋 確定子串行最大值得關鍵點在於確定序列開始位置和結束位置。開始位置難以確定,確定開始位置之後每加乙個數字的...

複雜度1 最大子列和問題

給定k個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。輸入格式 輸入第1行給出正整數 k 100000 第2行給出k個整數,其間以空格分隔。輸出格式...