演算法的級別
O(1)
、O(n)
、O(n^2)
、O(log n)
、O(n log n)
這些都是演算法時間空間複雜度的表示。不僅僅用於表示時間複雜度,也用於表示空間複雜度。O
後面的括號中有一個函式,指明某個演算法的耗時 / 耗空間與資料增長量之間的關係。其中的n
代表輸入資料的量
O(1) 的理解
O(1)
就是最低的時空複雜度了,也就是耗時/耗空間與輸入資料大小無關,無論輸入資料增大多少倍,耗時/耗空間都不變。無論資料規模多大,都可以在一次計算後找到目標(不考慮衝突的話)舉個栗子
- 比如你將家裡的衣服很多,裝了十個箱子,分別給他們打上標記
1
-10
。有一天,你突然想穿10
號箱子的一件衣服。你就可以迅速開啟箱子把衣服拿出來,而且速度非常快。
O(n) 的理解
- 時間複雜度為
O(n)
,就代表資料量增大幾倍,耗時也增大幾倍。 - 很多常見的遍歷演算法,要找到一個陣列裡面最大的一個數,你要把整個陣列都
for
一次,操作次數為n
,那麼演算法複雜度是O(n)
又舉個了栗子
- 有一天你突然很想穿某一件衣服,但是忘記衣服放在那個箱子裡面了。你就需要從
10
個箱子裡面挨個翻出來,並且找到你想要穿的衣服。
O(n^2) 的理解
- 時間複雜度
O(n^2)
,就代表資料量增大n
倍時,耗時增大n
的平方倍,這是比線性更高的時間複雜度。比如氣泡排序,就是典型的O(n^2)
的演算法,對n個數排序,需要掃描n×n
次。 - 用氣泡排序排一個陣列,對於
n
個變數的陣列,需要交換變數位置次,那麼演算法複雜度就是O()
. 雙舉個了栗子
- 因為你看了我的部落格,覺得衣服亂放有點不好,所以你把衣服,褲子,分別放在特定的箱子裡面。
- 當你想穿某件衣服的時候,只需要找到那個存放衣服的箱子,並且從箱子裡面的衣服裡面找到你想穿的哪一件就好了
O(log n) 的理解
- 當資料增大
n
倍時,耗時增大log n
倍(這裡的log
是以2
為底的,當資料增大256
倍時,耗時只增大8
倍,是比線性還要低的時間複雜度)。二分查詢就是O(log n)
的演算法,每找一次排除一半的可能,256
個資料中查詢只要找8次就可以找到目標。這種查詢的方法的複雜度就是O(log n)
叒舉個了栗子
- 某一天,你忘記了錢包不知道放哪裡了(在
6
號箱子),但是被你收入箱子裡面了。但是箱子太多,你找了朋友幫忙找。然後你安排你的朋友一人負責找一個箱子,並且他們找的時候,還會問你是不是這個,直到6
號朋友找到了錢包
O(n log n) 的理解
- 同理,
O(n log n)
就是n
乘以log n
,當資料增大256
倍時,耗時增大256 * 8 = 2048
倍。而且這個複雜度高於線性低於平方
本系列文章,基本寫的是 O(n^2) 級別的。
- 眾所周知,
O(n^2)
的排序演算法是比較基礎的 ( 很多時候都用不上 ) ,
那我們為什麼還要去學習O(n^2)
這種級別的演算法呢 ?可能在我看來,無非就是以下幾點。
- 基礎 - 大家也不要小瞧基礎演算法,很多基礎演算法的思路是非常好的。
- 簡單 - 編碼簡單,易於實現。簡單的排序演算法思想會衍生出複雜的排序演算法
- 有效 - 在某些特殊情形下,
O(n^2)
會比O(log n)
或者O(n log n)
,更加簡單有效
本作品採用《CC 協議》,轉載必須註明作者和本文連結
TimAutumnWind (轉載請註明出處 https://learnku.com/articles/39442)