演算法與資料結構系列 ( 一 ) - 演算法的級別區分理解

Tim-AutumnWind發表於2020-03-19

演算法的級別

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 協議》,轉載必須註明作者和本文連結

相關文章