先從O(1) 來講,理論上哈希表就是O(1)。由於哈希表是經過哈希函數來映射的,因此拿到一個關鍵 字,用哈希函數轉換一下,就能夠直接從表中取出對應的值。和現存數據有多少毫無關係,故而每次執行 該操做只須要恆定的時間(固然,實際操做中存在衝突和衝突解決的機制,不能保證每次取值的時間是完 全同樣的)。舉個現實的例子,好比個人身後有一排櫃子,裏面有香蕉(代號B),蘋果(代號A),葡萄 (G),如今你說A,我迅速的就把蘋果遞過來了;你說B,我迅速就把香蕉遞過來了。就算你再增長菠蘿 (P)、火龍果(H),可是你說一個代號,我遞給你相應的水果這個速度是幾乎不會變的。算法
至於O(n) ,這個就是說隨着樣本數量的增長,複雜度也隨之線性增長。典型的好比數數。若是一我的 從1數到100,須要100秒,那麼從1到200,基本上不會小於200秒,因此數數就是一個O(n) 複雜度的 事情。通常來講,須要序貫處理的算法的複雜度,都不會低於O(n) 。好比說,若是咱們要設計一個算 法從一堆雜亂的考試的卷子裏面找出最高的分數,這就須要咱們從頭至尾看完每一份試卷,顯然試卷越 多,須要的時間也越多,這就是一個O(n) 複雜度的算法。網絡
O(n2) 是說,計算的複雜度隨着樣本個數的平方數增加。這個例子在算法裏面,就是那一羣比較挫的 排序,好比冒泡、選擇等等。沿着咱們剛纔的說的那個試卷的例子,等咱們找出最高的分數以後,放在一 邊另起一堆,而後用一樣的方法找第二高的分數,再放到新堆上…… 這樣咱們作n次,試卷就按照分數從低 到高都排好了。由於有n份試卷,第一次翻卷找最高分,要找n份試卷,第二次翻卷要找n-1份試卷,第三次翻卷要找n-2份試卷.... ,總共要找n+(n-1)+(n-2)...+1次,也就是 (n+1)n/2次, 捨去常數,就是n2次. 算法時間複雜度就是O(n2). 再好比說構建一個網絡,每一個點都和其餘的點相連。顯然,每當咱們增長一個點,其實就須要構建這個點 和全部現存的點的連線,而現存的點的個數是n,因此每增長1,就須要增長n個鏈接,那麼若是咱們增長n 個點呢,那這個鏈接的個數天然也就是 O(n2) 量級了。函數
不管是翻試卷,仍是建立網絡,每增長一份試卷,每增長一個點,都須要給算法執行人帶來n量級的工做 量,這種算法的複雜度就是 O(n2)。設計
而後是O(nlogn) ,這是常見算法複雜度裏面相對難理解的,就是這個log怎麼來的。前面那個 n,表明執行了n次 的操做,因此理解了log(n),就理解了nlog(n)。排序
O(logn)的算法複雜度,典型的好比二分查找。設想一堆試卷,已經從高到底按照分數排列了,咱們現 在想找到有沒有59分的試卷。怎麼辦呢?先翻到中間,把試卷堆由中間分紅上下兩堆,看中間這份是大於 仍是小於59,若是大於,就留下上面那堆,別的丟掉,若是小於,就留下下面那堆,丟掉上面。而後按照 一樣的方法,每次丟一半的試卷,直到丟無可丟爲止。方法
具體舉一個例子, 假若有32份試卷,你丟一次,還剩16份 ,丟兩次,還剩下8 份,丟三次,就只剩下4份了,能夠這麼一直 丟下去,丟到第五次,就只剩下一份了。也就是咱們一次丟一半,總要丟到只有一份的時候才能出那個要找的59分的卷子,一共執行了5次,2的5次方=32, 若是有n份,也就是大約須要log2n 次,才能得出「找到」或者「沒找到」的結果。固然你說你三分查找,每次丟三 分之二可不能夠?固然也能夠,可是算法複雜度在這裏是忽略常數的,因此無論以2爲底,仍是以什麼數爲 底,都統一的寫成 的形式。數據
理解了這一點,就能夠理解快速排序爲何是 O(nlog(n))了。好比對一堆帶有序號的n本書進行排序,怎麼快速排序呢?就是隨便先選一本,而後把號碼大於這本書的扔右邊,小於這本書的扔左邊。由於每本書都要比較 一次,因此這麼搞一次的複雜度是O( n),那麼快速排序須要咱們重複多少次呢?這又回到了二分查找的邏 輯了,通過第一次後,這堆書一分爲二堆, 每堆是n/2本 , 在這兩堆上再重複上面的步驟, 每堆排序一次的步驟n/2次 兩堆共n/2+n/2=n次 , 再兩堆分四堆,每堆的步驟是n/4次, 四堆共n/4+n/4+n/4+n/4=n次.... 因此每次分堆後,總的步驟次數都是n次, 請問分多少次手裏每堆裏只有一本書呢?答案仍是log2n 。因此分堆次數是log2n ,而每分一次堆後排序總步驟是n次,所以總的次數是nlogn.也就是時間複雜度爲O(nlogn).算法複雜度