演算法複雜度分析基於以下四條定義:
若使用比較簡單(不甚準確)的表達:
時間估算中,認為每個操作花費時間為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個整數,其間以空格分隔。輸出格式...