1、演算法的由來
(1)抽象的計算概念(能行可計算)
由有限數量的明確有限指令構成
指令執行在有限步後終止
指令每次執行都能獲得唯一的結果
原則上可以由人單獨採用紙筆完成,而不依靠其他輔助
每條指令可以機械性地被準確執行,不需要智慧型和靈感
(2)圖靈機計算模型
一條無限長的分格紙帶,每格可以記錄1個符號
乙個讀寫頭,可在紙帶上左右移動,能讀出和擦寫格仔的字元
乙個狀態暫存器,記錄有限的狀態中的1個狀態
一系列有限的控 制規則:
讀寫頭移動方法,是否改寫,狀態改變
2、演算法和演算法的複雜性
要考慮演算法處理大數時的效率,所以需要考慮演算法的複雜性
時間複雜度:用基本操作的重複次數作為計量單位
賦值語句是最合適的選擇。
又是決定執行時間的不僅是問題規模,還有具體的資料也會影響執行時間
eg:排序時好的資料和壞的資料時間差距很大
常見o數量級 1 常數,log(n),n,n*log(n),n^2 , n3,2n
3、變位詞的判斷問題
變為詞:兩個單詞的組成字母的是重新排序heart,earth
(1)解法一:逐一檢查,存在就打個勾o(n**2)
(2)解法二:排序比較,先各自排序,再去逐個比較是否相同。排序步驟為主,o(nlog(n))
(3)解法三:暴力法,把f1的算有排列舉出來,然後再看s2是否在其中 o(n!)
(4)計數比較
對比兩個單詞中26個字母的出現次數是否相同o(n),代價是需要更多的儲存空間
import timeit
popzero=timeit.timer(
"x.pop(0)"
,"from __main__ import x"
)popend=timeit.timer(
"x.pop()"
,"from __main__ import x"
)print
"pop(0) pop()"
for i in
range
(1000000
,100000001
,1000000):
x=list
(range
(i))
pt=popend.timeit(number=
1000
) x=
list
(range
(i))
pz=popzero.timeit(number=
1000
)print
"%15.5f,%15.5f"
%(pz,pt)
最後畫成圖再看
字典
最常用操作get 和set是o(1)
資料結構之佇列(Python 版)
佇列的特點 先進先出 fifo 使用單鏈表技術,在表首尾兩端分別加入指標,就很容易實現佇列類。1 佇列類的實現23 class squeue 45 def init slef,init len 8 6 self.len init len 儲存區長度 7 self.elems 0 init le 元素...
Python資料結構(一)
演算法研究的是時空複雜度,它具有有窮性,確定性,可行性,還有輸入 輸出等特點 窮舉 萬能演算法 求n個數的全排列 8皇后問題 分而治之 減而治之 二分查詢 減而治之 歸併排序 分而治之 貪心 最小生成樹 prim,kruskal 單源最短路 dijkstra 動態規劃 揹包 士兵路徑 複雜度從小到大...
python資料結構(一)
在這裡插入 片線性結構 線性結構是一種有序資料項的集合,其中每乙個資料項都有唯一的前驅和後繼 第乙個沒有前驅,最後乙個沒有後繼 好比我們房子的左右鄰居都是唯一的。線性結構總有兩端,不同線性結構的關鍵區別在於資料項增減的方式,有的結構只允許在一段操作,有的結構允許在兩端操作。下面介紹幾種基本的線性結構...