前言:
數學中有演算法,計算機中亦有演算法,此處演算法系列討論的是計算機中的演算法。
說到演算法,就要聊一聊演算法的複雜度了。什麼是複雜度?為什麼要知道複雜度?如何衡量複雜度?了解這些,是我們寫好演算法的基礎。下面我們就來聊一聊演算法世界的標準,演算法的複雜度。
什麼是演算法複雜度,聽到這個名字,就是問號三連???
1.是什麼?
演算法有好壞之分,衡量演算法好壞的就是演算法的複雜度。演算法的複雜度分為時間複雜度,和空間複雜度。分別從不同的維度來說明衡量演算法的好壞。
2.為什麼要知道?
很多人覺得演算法很難,而且在工作中基本不會用到,就對演算法望而卻步。但是學習演算法可以讓我們更有邏輯,而且在資料量大的時候(比如雙十一購物的時候),演算法就顯得尤為重要了。學會演算法,日常寫效率高的**,還可以對演算法娓娓道來,讓小姐姐對自己刮目相看,它不香嗎,**厲害的程式設計師真的是超級帥!
3.如何衡量?
說到衡量演算法的標準,就要說到時間複雜度和空間複雜度了。今天呢,就先說一說時間複雜度
。
故事是這樣的,話說從前聰明的孩子,特別調皮的熊孩子,經常在課上搗亂,有一天老師終於忍無可忍,於是給熊孩子出了道題,算出1+2+3+4+5+…一直加到10000,算不完不許回家吃飯!老師以熊孩子會,從1+2=3,3+3=6…一直加下去,可能算到天亮都演算法不完,老師心裡正竊喜,結果幾分鐘後。熊孩子說,老師我算完了結果是50 005 000。老師心想,我讀書多,你算這麼快,騙不了我,結果一看到熊孩子的演算法,把數字分成兩組,首位相加1+10000,再看看一共有多少之後各樣的和呢,10000/2,於是就有了(1+10000)*10000/2=50 005 000。
這個熊孩子就是著名的猶太數學家約翰 卡爾 弗里德里希 高斯,而他採用的就是等差數列求和的方法,被稱為高斯演算法。(故事參照《小灰演算法》且與史實有出入)。
向開始的1+2=3…然後一直加下去的演算法,肯定比分組演算法的時間花費的多得多,這就是演算法的時間上的差異,可以簡單理解為演算法時間複雜度。
那麼真正演算法的時間複雜度是怎麼定義的呢?其實就是執行乙個程式所花費的時間,主要有如下幾個原則:
* 如果執行時間是常數量級,則用常數字1表示。
舉個例子:t(n)=2,則時間複雜度為t(n)=o(1)
* 只保留時間函式中的最高端項。
舉個例子:t(n)=n²+2n,則時間複雜度為t(n)=o(n²)
* 如果最高端項存在,則省去高階項前面的係數。
舉個例子:t(n)=2logn,則時間複雜度為t(n)=o(logn)
t(n)=2n,則時間複雜度為t(n)=o(n)
所以呢,演算法都是沒有係數的。
那麼上面的例子中演算法的時間複雜度,誰執行時間長,誰更節省時間呢?當n最夠大時,可以看到:
o(1) < o(logn) < o(n)小結
演算法之時間複雜度
前言 學習這東西,很枯燥也很煩,參考許多博文,選了許多。結合一些東西,記錄一下,也是為了以後回顧學習。演算法效率 說到演算法效率 不得不提兩個指標,那就是 時間複雜度 空間複雜度 好的演算法應該具備時間效率高和儲存量低的特點。計算機能快速完成大量複雜的資料處理,但是要完成這個工作,計算機也是需要一定...
演算法時間複雜度的衡量
演算法複雜度分為時間複雜度和空間複雜度,乙個好的演算法應該具體執行時間短,所需空間少的特點。隨著計算機硬體和軟體的提公升,乙個演算法的執行時間是算不太精確的。只能依據統計方法對演算法進行估算。我們拋開硬體和軟體的因素,演算法的好壞直接影響程式的執行時間。我們看一下小例子 int value 0 執行...
演算法之 時間複雜度和空間複雜度
平時用的少,經常忘記,這裡記錄下時間複雜度的概念 複雜度是演算法的一種標記方法。用o表示,通常讀為big o o的包含了時間複雜和空間複雜度 這裡就只說時間複雜度。時間複雜度的概念,個人總結,可能不太準確。時間複雜度,即標記乙個問題,隨著問題規模的變化,所需要花費時間的關係。時間複雜度就是問題規模和...