Python資料結構(一)

2021-08-27 14:07:15 字數 2055 閱讀 3959

演算法研究的是時空複雜度,它具有有窮性,確定性,可行性,還有輸入/輸出等特點

窮舉(萬能演算法):求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個符號...