演算法研究的是時空複雜度,它具有有窮性,確定性,可行性,還有輸入/輸出等特點
窮舉(萬能演算法):求n個數的全排列、8皇后問題
分而治之(減而治之):二分查詢——減而治之、歸併排序——分而治之
貪心:最小生成樹 prim, kruskal、單源最短路 dijkstra
動態規劃:揹包、士兵路徑
複雜度從小到大排序有:
o(1):基本運算,+,-,*,/,%,定址
o(log(n
) log(
n)
):二分查詢 o(n
−−√ n
):列舉約數
o(n):線性查詢、讀入n個數 o(n
2 n
2):樸素最近點對、快速排序的複雜度 o(n
3 n
3):floyd最短路、普通矩陣乘法 o(n
log(n)
n
log(n
)):歸併排序、快速排序的期望複雜度、基於比較排序的演算法下界 o(2
n 2
n) :列舉全部的子集
o(n!):列舉全排列
總結:
優秀的時間複雜度: o(1) < o(
log(n)
log(n
)) < o(n−
−√n
)) < o(n) < o(
nlog(n
) n
log(n
))
可能可以優化: o(n2
n
2) < o(n3
n
3) < o(2n
2
n) < o(n!)
常見時間複雜度分析方法:
估算時常認為計算機一秒可以處理1億條指令,2的27次方即超過1億
輸入輸出(輸入n個數即有o(n))
數迴圈次數(迴圈n次的巢狀迴圈數次方)
均攤分析(多個操作,一起算時間複雜度)
multipop的佇列:可以一次性出隊k個元素,每個元素只出入佇列一次。複雜度o(1)
動態陣列尾部插入操作(vector):一旦元素超過容量限制,則擴大一倍,再複製。
給定陣列a[1…n],求最大子陣列和,即找出1<=i<=j<=n,使a[i]+a[i+1]+…+a[j]最大
介紹三個演算法:
暴力列舉 o(n3)
優化列舉 o(n2)
貪心法 o(n)
暴力列舉:三重迴圈
for i → 1 to n
for j → i to n
sum → a[i]+..+a[j]
ans → max(ans, sum)
時間複雜度 o(n3n3
) 附加空間複雜度 o(1)
優化列舉:兩重迴圈
for i → 1 to n
sum → 0
for j → i to n
sum → sum + a[j]
ans → max(ans, sum)
時間複雜度 o(n2n2
) 附加空間複雜度 o(1)
貪心法:一重迴圈
sum → 0
ans → 0
for i → 1 to n
sum → sum + a[i]
ans → max(sum, ans)
if (sum < 0) sum → 0
時間複雜度 o(n) 附加空間複雜度 o(1)
其他,用變數替換就可以得到貪心法!!!
si → 0
minsi → 0
ans → 0
for j → 1 to n
if (si < minsi) minsi → si
if (si + a[j]- minsi > ans) ans → sj - minsi
si += a[j]
用 sum 代替 si-minsi,則 minsi → si 變成 sum → 0
python資料結構(一)
在這裡插入 片線性結構 線性結構是一種有序資料項的集合,其中每乙個資料項都有唯一的前驅和後繼 第乙個沒有前驅,最後乙個沒有後繼 好比我們房子的左右鄰居都是唯一的。線性結構總有兩端,不同線性結構的關鍵區別在於資料項增減的方式,有的結構只允許在一段操作,有的結構允許在兩端操作。下面介紹幾種基本的線性結構...
Python資料結構 列表(一)
這一節介紹python中最基本的資料結構 列表。列表的表示如下 123 abc hahah 456 0 列表中的每一項,我們稱之為乙個元素。1 使用中括號把所有元素都括起來。2 元素之間用逗號分割 3 元素之間的型別沒有要求,可以一樣,也可以不一樣。例子中的元素既有字串型別,也有整數型別。列表是一種...
資料結構python版(一)
1 演算法的由來 1 抽象的計算概念 能行可計算 由有限數量的明確有限指令構成 指令執行在有限步後終止 指令每次執行都能獲得唯一的結果 原則上可以由人單獨採用紙筆完成,而不依靠其他輔助 每條指令可以機械性地被準確執行,不需要智慧型和靈感 2 圖靈機計算模型 一條無限長的分格紙帶,每格可以記錄1個符號...