關於算法複雜度

1、算法複雜度 

算法複雜度,即算法在編寫成可執行程序後,運行時所須要的資源,資源包括時間資源和內存資源。算法

同一問題可用不一樣算法解決,而一個算法的質量優劣將影響到算法乃至程序的效率。算法分析的目的在於選擇合適算法和改進算法。一個算法的評價主要從時間複雜度空間複雜度來考慮。編程

 

OK!看到此處,我想你們應該簡單明白了算法複雜度是怎麼一回事。若是你是計算機科班或者數學專業出身恰巧你的成績又很不錯的,那你就不須要繼續往下看了。由於做者根本不是學計算機出身的,對於這些高深的知識,在查閱不少資料後也是似懂非懂,更不能向你們很好的闡述裏面的道理。但又不想跟風去複製粘貼百度上的東西。因此,我想既然看到這裏的讀者應該絕大多數都是似懂非懂的。我認爲在這麼擺事實、講道理就沒意思了。若是能用現實中身邊的例子來講明這些,那也是更好不過了。固然,做者如有機會也會好好折騰一番弄明白這裏面究竟講的是個啥。我想這也符合每個力求上進的騷年所具有的心態。性能

 

一、時間複雜度

經過查看百度百科也大體瞭解到時間複雜度的大體意思。還有那些抽象的字母表達式。對於那些東西我就不在複製粘貼到此了。不如用更簡潔易懂的實例來講說這裏面的大體意思,在以前的一篇貌似是大學老師的博客裏看到頗有意思的說明。優化

假設CPU在短短几年內,速度提升了10唄。雖有有摩爾定律,這其實已經很誇張了。而咱們的某個算法本能夠寫出時間複雜度是O(n)的算法,卻寫成了O(n^2)的程序,僅僅由於容易想到,也容易寫。即在O(n^2)的時間複雜度程序下,速度其實只提升了10(根下100=10)倍。而對於O(n)時間複雜度的算法來講,那纔是真的100倍。也就是說,一臺老式CPU的計算機運行O(n)的程序和一臺速度提升100倍新式CPU運行O(n^2)的程序,最終效率高的勝利方倒是老式CPU的計算機。緣由在於算法的優劣直接決定了程序運行的效率。因而可知,時間複雜度是很是重的一個衡量算法好快的事前估算的方法。
spa

關於時間複雜度的計算方法再也不贅述。這裏說一下最壞狀況平均狀況的時間複雜度。當你早上起牀準備出去吃飯上課的時候,到了宿舍樓下才忽然響起來,手機忘記帶了。這年頭,鑰匙、錢包、手機三大件,哪樣也不能少啊。回宿舍打開門一看,手就在對門的窗臺上放着。這固然是比較好的,基本沒花什麼時間。但是若是不在那裏,你就獲得處找。可能翻遍了書桌和壁櫥,等找到的時候都快8點了,匆匆去上課,早飯算是泡湯了。找東西有運氣好的時候,也有怎麼都找不到的時候,但在現實中,一般咱們碰到的絕大多數既不是最好也不最壞的,因此算下來是平均狀況居多。設計

算法分析也是如此,在n個隨即數中查找某個數字,最好的狀況是第一個數字就是,此時時間複雜度爲O(1),若最後一個數字纔是咱們要找的,那麼時間複雜度是O(n),這是最壞的狀況。而平均運行時間是從機率的角度看,若數字在每個位置均可能出現,則平均查找次數爲n/2次htm

平均運行時間是全部狀況中最有意義的,由於它是指望的運行時間。可現實中,平均運行時間很難經過分析獲得,通常都是經過運行必定數量的實驗數據後估算而來的。而最壞運行時間是一種保證,那就是運行時間不會再壞了。在應用中,這是最重要的需求,一般,除非特別指定,咱們提到的運行時間都是最壞狀況下的運行時間。即,時間複雜度是最壞狀況下的時間複雜度。內存

 

常見的算法時間複雜度由小到大依次爲:資源

O(1)<O(log2n)<O(n)<O(n log2 n)<O(n^2)<O(n^3)<O(2^n)get

 

 

二、空間複雜度

空間複雜度的概念就簡單許多了,簡單來講就是在執行算法時所佔用的內存資源。除去專業術語和計算方法,用大白話還真不知道怎麼說的更多一些。

 

值得一提:

  對於一個算法,其時間複雜度和空間複雜度每每是相互影響的。當追求一個較好的時間複雜度時,可能會使空間複雜度的性能變差,便可能致使佔用較多的存儲空間;反之,當追求一個較好的空間複雜度時,可能會使時間複雜度的性能變差,便可能致使佔用較長的運行時間。

  就好像咱們解決一個問題時,有不少種解決辦法,這裏就對應了不少種算法。在選擇某一種算法時,咱們應該分析這種算法所帶來的成本與收益。由於每一種算法都有其本身的特性,若是時間節省了,但就可能浪費空間。反之亦然。

 

 過後感慨:

 通過幾個簡單的算法的洗禮,忽然發現以前作的東西太簡單了。並非說以前作的東西沒有價值,而是從作技術的職業生涯來看,普通的編程也許很快就會遇到瓶頸。但研究了幾個算法以後。彷佛看到了一條更長遠的道路,相比代碼的累加,這種經過精心的設計而達到的優化效果顯得更有趣味和挑戰性。由此感慨,要學的東西還太多太多,不只僅是經驗的累加,更應該是智力和思惟的突破。

相關文章
相關標籤/搜索