轉載~時間複雜度分析(個人強推)

這些都是算法時空複雜度的表示。不僅僅用於表示時間複雜度,也用於表示空間複雜度。 
O後面的括號中有一個函數,指明某個算法的耗時/耗空間與數據增長量之間的關係。其中的n代表輸入數據的量。

O(1)解析
O(1)就是最低的時空複雜度了,也就是耗時/耗空間與輸入數據大小無關,無論輸入數據增大多少倍,耗時/耗空間都不變。 哈希算法就是典型的O(1)時間複雜度,無論數據規模多大,都可以在一次計算後找到目標(不考慮衝突的話),衝突的話很麻煩的,指向的value會做二次hash到另外一快存儲區域。

通俗易懂的例子

什麼是O(1)呢,就比如你是一個酒店的管理員,你負責管理酒店的鑰匙,你很聰明,你把酒店的100把鑰匙放在了100個格子裏面存着,並且把格子從1~100進行了編號,有一天有客人來了,酒店老闆說,給我拿10號房間的鑰匙給我,你迅速從10號格子裏面拿出鑰匙給老闆,速度非常快,這時候你就是一個電腦了,老闆跟你說拿幾號房房間的鑰匙,你只需要看一眼就能知道鑰匙在哪裏。

O(n)解析
比如時間複雜度爲O(n),就代表數據量增大幾倍,耗時也增大幾倍。

比如常見的遍歷算法。 

要找到一個數組裏面最大的一個數,你要把n個變量都掃描一遍,操作次數爲n,那麼算法複雜度是O(n).

通俗易懂的例子

突然,有一天,你的老闆給你說,你用100個箱子存100把鑰匙,太浪費空間了,你能補能把鑰匙上編號一下,然後把鑰匙要用繩子穿起來,這樣我們可以把這個放箱子的地方再裝修一個房間出來。你想了一下,是啊,現在房價這麼貴,這樣能多賺點錢。所以你就不能通過上面的方法來找到鑰匙了,老闆跟你說,給我拿45號房間的鑰匙出來,你就需要從100個鑰匙裏面挨個找45個房間的鑰匙。

O()解析
O()的寫法爲:O(n^2) 

再比如時間複雜度O(n^2),就代表數據量增大n倍時,耗時增大n的平方倍,這是比線性更高的時間複雜度。比如冒泡排序,就是典型的O(n^2)的算法,對n個數排序,需要掃描n×n次。 

用冒泡排序排一個數組,對於n個變量的數組,需要交換變量位置次,那麼算法複雜度就是O().

通俗易懂的例子

隨着經濟發展越來越好,你的老闆把酒店擴大了,有100層每一層有100個房間,當然,你還是你,不過你因爲關注我的博客,知道怎麼把鑰匙排序更好了,你把每一層的鑰匙穿在一起,然後一共就有100個用繩子穿起來的鑰匙串。然後老闆叫你找鑰匙的時候,你先要找到樓層的編號,再對應找到房間的編號,所以大概對應的是這樣的代碼。

O(log n)解析
再比如O(log n),當數據增大n倍時,耗時增大log n倍(這裏的log是以2爲底的,比如,當數據增大256倍時,耗時只增大8倍,是比線性還要低的時間複雜度)。二分查找就是O(log n)的算法,每找一次排除一半的可能,256個數據中查找只要找8次就可以找到目標。 

通俗易懂的例子

這個就像是有一百把鑰匙,你突然覺得,我從頭找是不是太慢了,我從中間找,比如我要找到23號的房間鑰匙,我從中間切開,找到50編號的位置,然後23在1~50裏面,我再把從中間切開變成25,然後23在1~25之間,我再切開變成12.5,然後23在12.5~25之間,依次找下去,直到找到鑰匙。這種查找鑰匙的方法的複雜度就是O(log^n)

O(n log n)解析
O(n log n)同理,就是n乘以log n,當數據增大256倍時,耗時增大256*8=2048倍。這個複雜度高於線性低於平方。歸併排序就是O(n log n)的時間複雜度。 

 

 

 

不管做什麼,只要堅持下去就會看到不一樣!
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章