演算法的級別
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),更加簡單有效
更多學習內容請訪問:
騰訊T3-T4標準精品PHP架構師教程目錄大全,只要你看完保證薪資上升一個臺階(持續更新)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/73403.html
標籤:PHP
