小白問題,關於演算法複雜度,為什麼要省略n前面的常數?

時間 2021-05-31 23:54:08

1樓:龍陽桑

可以用修路來理解。 所謂的複雜度實際上理解為個人修路的速度。

1個人1天修10公尺。

10個人1天修了10公尺。

現在你說10個人修的速度比1個人修的快,是1個人修的10倍。結論自然是正確的。但是意義何在?

所以這裡顯然比較1個人的修路效率才是我們真正要的東西。這裡我們可以看到在10人團隊中,每個人也是相當於1天修了1公尺,所以兩者的速度是相當的。也就是說O(10n)=O(n)

如果有另乙個10人1天修了9公尺。

那麼顯然這個團隊就不及第乙個團隊速度快。雖然第一種情況下只有乙個人,但我可以把這1個人擴充到10個人,這樣我的效率自然就會比第二個團隊速度快。這也是研究演算法複雜度最核心的意義。

2樓:CuKing

一是定義問題,O記號本身的定義就決定了這個常數是不需要寫的

二是實際上常數受各種或玄學或不玄學的因素影響,很難去估算,不如自己去電腦上跑一跑來的準,你要非去寫上這個常數也沒人管你,只是一般實在沒必要罷了

3樓:f321dd

那麼你說說看,10n的10是個啥?每次執行10個語句?那如果每個語句多了幾倍的運算還一樣嗎?

而且你知道每個語句背後的實際計算量嗎?如果這些全部無視掉,那你乙個O(n)可以比另乙個O(10n)還慢。

所以演算法複雜度用的是漸進記號。這意味著我們並不能保證乙個複雜度更低的演算法就一定能更快,但是當資料規模變大時,複雜度低的演算法一定會比複雜度高的演算法變慢的程度更小。那麼在根據實際情況,如果我們需求的資料規模較大,複雜度低的演算法很可能就確實會更快。

當然,O(10n)=O(n)這個式子本身是漸進記號的定義決定的。

4樓:

在n足夠大的時候,常係數可以忽略。換句話說,1s跟10s差距沒那麼大,都屬於「跑得出來」。

取n=1億,假設對數複雜度需要1s

lg n = 8,假設為1s

10 lg n = 80,約10s,

n = 1e8,約144天

n2 = 1e16,約3000萬年

5樓:rqy

所謂「複雜度」,即「漸進複雜度」,顧名思義只是在「漸進」的意義下分析,換句話說就是只是衡量複雜度的增長率。大O符號的定義是這樣的:我們說乙個函式f(n)(分析複雜度的話,就是程式占用的時間或空間)是O(g(n))的,是指存在乙個常數c使得f(n) <= c*g(n)。

這裡可以把c理解為乙個基礎,而g(n)衡量增長率,比如O(n^3)就是說演算法時間在n漲到兩倍的時候至多漲到八倍。而這個c,一般被稱為程式的「常數」,它與很多方面相關,除了演算法本身以外還與實現細節等等有很大關係(因此會有人自嘲「我自帶大常數」這種):而這些東西是很難分析的,所以一般情況下只會分析漸進複雜度,而常數過大(如10倍甚至100倍)的演算法一般會被特別指出。

6樓:Allen Chen

簡單來說在做演算法分析的時候只關注趨勢,10n和n都是在說這個演算法是線性的,具體工程的時候另算,工程的複雜度很多時候取決於你的具體實現。

關於演算法時間複雜度,O n 到底有多大?

Joker 現在很多機器 膝上型電腦 大約每秒鐘能夠執行大約v 10 9條指令 這個數量級 O n 2 的演算法可以認為它有不超過c n 2條需要執行的指令。c是某個常數,可以很大,c通常的程式在1 10之間。秒數大約c n 2 v。你如果時間複雜度沒算錯,那麼大概是c很大,或者v很小。要麼是演算法...

演算法時間複雜度為O(n )的是什麼演算法?

子正 O n 的演算法不稱其為演算法,它意味著這個問題尚未解決。n稍微大一點,就會耗盡CPU的算力。它比不斷摺紙 圍棋盤上擺大公尺得到的數更大。這種 演算法 是進行演算法改進的物件。演算法老師沒有花力氣說明這種演算法的荒謬之處倒是個很不可思議的事情。n 是個很大的數,你可以用windows自帶的計算...

為什麼有些人做題的時候總想用複雜度不靠譜的演算法衝一發?

ijrys 實踐證明,有時候再怎麼優化的查詢演算法也比不過暴力的BM拋開ACM談一談吧 自己在pintia上出過一些題,因為pintia並不是純面相競賽方向同學的,所以pintia上評分方法有很多種,有一種是按點得分。造資料要能突出不同演算法確實得花時間,有時候乙個題能出一晚上,各種方法都實現一遍 ...