碼字不易,對你有幫助點讚/**/關注支援一下作者看更多乾貨,獲取第一時間更新
【資料結構輕鬆學】系列 github :
二 空間複雜率
演算法中的基本操作的執行次數,為演算法的時間複雜度。實際中我們計算時間複雜度時,我們其實並不一定要計算精確的執行次數,而只需要大概執行次數
我們使用大o的漸進表示法。
1. 表示方式
int
find
(int
* arr,
int n,
int value)
}
for 迴圈中 if 語句的判斷就是這個程式的 基本操作
這個演算法的最壞情況下的時間複雜度就是:o(n)
平均情況:o(n/2)
最好情況:o(1)
2. 例題
例1
void
func2
(int n)
int m =10;
while
(m--
)printf
("%d\n"
, count)
;}
答案:o(n)
例2
void
func3
(int n,
int m)
for(
int k =
0; k < n;
++k)
printf
("%d\n"
, count)
;}
答案:o(m + n)
例3
void
fun(
int m)
}
答案:o(1)
因為程式執行的次數是 n 次,是乙個定值,所以複雜度就是常數次。
如果程式這樣修改:
void
fun(
int m)
}
這時候複雜度就是 o(n)
只要你知道 n 的確定大小,那複雜度就是 o(1),如果你不知道 n 可能多大,那複雜度就是 o(n)
所以 o(1) 的複雜度的演算法不一定比 o(n) 的演算法更優
例4
void
func4
(int n)
printf
("%d\n"
, count)
;}
答案:o(1)
例5
void
bubblesort
(int
* a,
int n)}if
(exchange ==0)
break;}
}
答案:o(n^2)
外層迴圈執行 n 次,內層迴圈 最多一次執行 n 次。(總是計算最壞情況)
例6
int
binarysearch
(int
* a,
int n,
int x)
return-1
;}
答案:o(logn)
logn 的意義是 log 以 2 為底的 n,也可以寫做 lgn,計算機中底數預設為 2
這是 二分查詢的程式,前提是陣列是有序的
例7
long
long
factorial
(size_t n)
答案:o(n)
函式呼叫了 n 次
例8
long
long
fibonacci
(size_t n)
答案:o(n^2)
函式以 2 的指數次數被呼叫,不用糾結與於細節
空間複雜度是對乙個演算法在執行過程中臨時占用儲存空間大小的量度空間複雜度算的是變數的個數
1. 表示方法
空間複雜度計算規則基本跟實踐,複雜度類似,也使用大o漸進表示法2. 例題
例1
void
bubblesort
(int
* a,
int n)}if
(exchange ==0)
break;}
}
答案:o(1)
例2
long
long
*fibonacci
(size_t n)
return fibarray;
}
答案:o(n)
malloc 的空間大小 與 傳入的變數 n 有關
例3
long
long
factorial
(size_t n)
答案:o(n)
遞迴呼叫了 n 次,開闢了 n 個棧幀,空間複雜度為 o(n)
看更詳細的目錄:我是程式圓,我們下次再見。不要忘記 star 呦~
資料結構 筆記(一)演算法介紹
資料結構 順序結構 鏈式結構 演算法五個特性 輸入 演算法具有零個或多個輸入 輸出 演算法具有乙個或多個輸出 有窮性 指演算法在執行有限步驟之後,自動結束而不是出現無限迴圈,並且每乙個步驟在可接受的時間內完成 確定性 演算法的每乙個步驟都具有確定的含義,不會出現二義性,演算法在一定條件下,只有一條執...
資料結構 演算法效率
資料結構之前,先來了解兩個概念 時間複雜度 由來 這裡的時間複雜度不是程式執行的時間。評價乙個演算法的好壞,並不能通過程式執行的快慢來評估。因為程式的執行快慢還有很多因素,和計算機硬體有關,所以如果在不同的電腦上 執行的時間可能不一樣 那麼這裡的時間複雜度指啥,指的是演算法中基本操作的執行次數。比如...
從零開始 學 資料結構(一) 演算法的基本概念
從零開始 學 資料結構 一 演算法 演算法的定義 解決問題的方法。對於同乙個問題,乙個好的演算法比乙個差的演算法,效率更高,更節約資源。for computer 演算法是解決特定問題的求解步驟的描述,在計算機中,表示指令的有限序列,每條指令表示乙個或者多個操作。簡單來說,演算法就是輸入 告訴計算機,...