1 大O:數步數
數步數 為了統一描述,大O不關注算法所用的時間,只關注其所用的步數。
數組不論多大,讀取都只需1步。用大O記法來表示,就是:O(1) 很多人將其讀作“大O1”,也有些人讀成“1數量級”。一般讀成“O1”。雖然大O記法有很多種讀法,但寫法只有一種。
若用大O記法來描述一種處理一個N元素的數組需花N步的算法的效率,很簡單,就是O(N)。
2 常數時間與線性時間
大O解答的是這樣的問題:當數據增長時,步數如何變化?
O(N)算法所需的步數等於數據量,意思是當數組增加一個元素時,O(N)算法就要增加1步。而O(1)算法無論面對多大的數組,其步數都不變。
O(N)呈現為一條對角線。O(N)也被稱為線性時間。
O(1)則為一條水平線,O(1)也被稱為常數時間。
因為大O主要關注的是數據量變動時算法的性能變化,不管數據量怎樣變化,算法的步數都恆定,所以這也是常數時間,也可以表示為O(1)。
O(1)就是用來表示所有數據增長但步數不變的算法。
3 同一算法,不同場景
線性查找並不總是O(N)的。當要找的元素在數組末尾,那確實是O(N)。但如果它在數組開頭,1步就能找到的話,那么技術上來說應該是O(1)。所以概括來說,線性查找的最好情況是O(1),最壞情況是O(N)。大O記法一般都是指最壞情況。
4 第三種算法
二分查找的大O記法是:O(logN)我將其讀作“O log N”。歸於此類的算法,它們的時間復雜度都叫作對數時間。
簡單來說,O(logN)意味着該算法當數據量翻倍時,步數加1。
5 對數
log即是對數(logarithm)。
對數是指數的反函數
6 解釋O(log N)
當我們說O(logN)時,其實指的是O(log2N),不過為了方便就省略了2而已。
二分查找所干的事情。它就是不斷地將數組拆成兩半,直至范圍縮小到只剩你要找的那個元素。
簡單來說,O(logN)算法的步數等於二分數據直至元素剩余1個的次數。
每次數據量翻倍時,O(N)算法的步數也跟着翻倍,O(logN)算法卻只需加1。
參考:數據結構與算法圖解.3