這是一本零基礎入門的書,寫得很是的淺顯易懂,就算不會寫代碼也能看懂。並且很薄,內容很少,一兩個星期就能看完。
主要講了時間複雜度的概念、常見的的數據結構和算法。
對於想學數據結構和算法,又啃不下看不懂《算法導論》那種大部頭書的人,強烈推薦看這本小書入門。不看會後悔系列:)
書的豆瓣地址:https://book.douban.com/subje...
我這篇筆記只整理了前三章的內容。算法
通常數據結構都有如下4 種操做(或者說用法)。讀取
:查看數據結構中某一位置上的數據。查找
:從數據結構中找出某個數據值的所在。插入
:給數據結構增長一個數據值。刪除
:從數據結構中移走一個數據值。數組
操做的速度,並不按時間計算,而是按步數
計算。數據結構
對數組進行讀取操做
,即查看數組中某個索引所指的數據值,這只要一步
就夠了,由於計算機自己就有跳到任一索引位置的能力。
當程序聲明一個數組時,它會先劃分出一些連續
的空格子以備使用。
只須要一步,是由於:
(1) 計算機能夠一步就跳到任意一個內存地址上。
(2) 數組自己會記有第一個格子的內存地址,所以,計算機知道這個數組的開頭在哪裏。
(3) 數組的索引從0 算起。
(4) 數組的格子是連續的。
因此,數組的讀取是一種很是高效的操做,由於它只要一步就好。一步天然也是最快的速度。
這種一步讀取任意索引的能力,也是數組好用的緣由之一。數據結構和算法
對數組進行查找操做
,須要從第0個,到最後一個,挨個尋找
數組中的每一個值(遍歷數組),直到找到爲止。
最好的狀況只須要一步,在數組的第0個找到了,最壞的狀況,長度爲N的數組,須要N步
,找到最後一個才找到、或者找不到。性能
對數組進行插入操做
,須要把插入位置後面的值日後移,爲新插入的元素騰出空間。最好的狀況是在數組末尾插入,只須要一步,直接插入,不須要騰空間。最壞的狀況是在數組的開頭插入,要把數組的每一項都日後移一位,長度爲N的數組,須要N步
操做。code
對數組進行刪除操做
,須要刪除元素,而後把元素後面的全部元素都往前移一位。跟插入同樣,最好的狀況是刪除數據末尾的元素,最壞的狀況是刪除數組開頭的元素,須要N步
。索引
影響算法性能的主要因素是其所需的步數。
內存
對於數組的查找,咱們能夠這樣描述:對於具備N個元素的數組,查找操做最多須要N步。(通常叫這種查找爲「線性查找」)
get
這聽起來很囉唆。爲了方便表達數據結構和算法的時間複雜度,計算機科學家從數學界借鑑了一種簡潔又通用的方式,那就是大O記法
。數學
數組不論多大,讀取都只需1 步。用大O 記法來表示,就是:O(1) 也叫常數時間。
對於N 個元素的數組,線性查找須要花N 步。用大O 記法來表示,即爲:O(N) 也叫線性時間。
二分查找的大O 記法是:O(log N) 也叫對數時間。
O(log N) 也就是O(log2 N),不過爲了方便就省略了2而已。
O(log N)則表明算法處理N 個元素須要log2 N 步。若是有8 個元素,那麼這種算法須要3 步,由於log2 8 = 3。
從另外一個角度來看,若是要把8 個元素不斷地分紅兩半,那麼得拆分3 次才能拆到只剩1 個元素。
這正是二分查找所幹的事情。它就是不斷地將數組拆成兩半,直至範圍縮小到只剩你要找的那個元素。
雙層嵌套for循環的大O記法是: O(N²) 也被叫做二次時間
對於N個元素的數組,使雙層嵌套for循環,要操做N*N步。