小白一枚,用部落格記錄我的所學,今天學了時間空間複雜度,搜了好多,但是沒有自己認為非常詳細的講解,學完之後自己整理了一下筆記。(第一次寫部落格,不足之處請指出,多多指教,多多海涵~)
還請各位少俠慢慢**,細心挑錯( * _ *)
演算法,是指用來運算元據、解決程式問題的一組方法。對於同乙個問題,使用不同的演算法,也許結果是一樣的,但在過程中的資源消耗和時間卻會有很大的區別。
那從什麼方面來考慮捏??
答:主要是從演算法所占用的 時間 和 空間 兩個維度去度量。
時間複雜度 : 度量演算法執行時間的長短
空間複雜度 : 度量演算法所需儲存空間的大小
^ _ ^,那麼我們就要學會去計算自己所寫的程式的時間複雜度和空間複雜度
一、時間複雜度的計算:
先舉乙個栗子:
計算時間複雜度例子
for i in range(0
,n):
print
("hello"
)for j in range(0
,n):
print
("byebye~"
)
乙個演算法中的語句執行次數稱為語句頻度或時間頻度。記為t(n)
演算法的基本操作重複執行的次數n記為某乙個函式f(n),因此,演算法的時間複雜度記做:
t(n)=o( f(n) )
隨著n的增大,演算法執行的時間和f(n)成正比,所以f(n)越小,演算法的時間複雜度越低,演算法的效率越高。
步驟
在計算時間複雜度的時候
1.先找出演算法的基本操作,然後根據相應的各語句確定它的執行次數,再找出t(n)的同數量級(它的同數量級有:12
3<2n
計算時間複雜程度的步驟(以上述**為例):
1.t(n) = n + n2 數量級為n2,f(n) = n2
2.求n趨近於正無窮時,lim t(n)/f(n) 如果結果為不等於零的常數c,那麼時間複雜度t(n)=o(f(n))
求f(n)時,忽略掉t(n)中的常數、低次冪、高次冪的係數
簡化版步驟:
再來分析一下,可以看出,決定演算法複雜度的是執行次數最多的語句,一般也是最內迴圈的語句。並且,通常將求解極限是否為常量也省略掉.
於是,以上步驟可以簡化為:
1. 找到執行次數最多的語句
2. 計算語句執行次數的數量級
3. 用大o來表示結果
複雜程度大小:o(1)2)3)n)二、空間複雜度的計算
1.常量空間
當演算法的儲存空間大小固定時,和輸入規模沒有直接的關係時,空間複雜度記作o(1) 。
2.線性空間
當演算法分配的空間是乙個線性的集合,並且集合大小和輸入規模n成正比時,空間複雜度記作o(n)
空間複雜程度不會計算,記憶體這方面不太懂,先放著罷(qtq)
三、取捨
對於空間,時間的取捨要權衡利弊,兩者相權取其輕。
如果兩者差不多就選取時間短的(也要考慮按實際要求,條件等)
演算法時間複雜度空間複雜度
演算法 是解決某一類問題的通法,即一系列清晰無歧義的計算指令。每個演算法只能解決具有特定特徵的一類問題,但乙個問題可由多個演算法解決。乙個演算法應該有以下五個方面的特性 比較演算法的優劣我們從兩個維度去進行考量 時間 空間 時間複雜度,空間複雜度 找出基本語句 演算法中執行次數最多的那條語句就是基本...
演算法 時間複雜度 空間複雜度
1 if i 1 2 a 1 result 3 4 result n 2 result 1000 1000 3 array.push a array.pop 4 map.set 1,1 map.get 1,1 在計算複雜度的時候,o 1 一般會被忽略。1 for let i 0 i n i 2 wh...
演算法的時間複雜度 空間複雜度
時間複雜度和空間複雜度是度量演算法效率的常用指標 事後統計,不常用 事前統計影響因素 演算法策略 問題規模 程式語言 質量 機器執行指令的速度 撇開軟硬體的影響,演算法執行工作量的大小只依賴於問題的規模 通常用整數n表示 乙個演算法是由控制結構 順序,分支,迴圈三種 和原操作 指固有資料型別的操作 ...