二分检索用途及复杂性_二分查找和三分查找哪个快?算法复杂度与常数无关?复杂度分析的常见误区...
還記得兩三年前,我初看一本算法書,看到二分查找算法的復(fù)雜度時(shí),我發(fā)現(xiàn)了了不得的東西:二分查找每次查詢范圍減少一半,需要查詢的次數(shù)是
,它的復(fù)雜度是
。
我把它改成三分查找,每次查詢兩個(gè)數(shù)字與我的目標(biāo)數(shù)字比較,那么我就可以把查詢范圍縮小成原先的 1 / 3。那這樣我需要的查詢次數(shù)就只有
,復(fù)雜度也是
,一下子就優(yōu)化了這么多!
那如果是四分,五分,六分,七分,豈不是能無限優(yōu)化到
?我要成為算法科學(xué)家啦!
當(dāng)然,我的想法是錯(cuò)的。但是,我錯(cuò)在哪里呢?為什么三分的復(fù)雜度看起來低了,但是卻沒有人用?好了,正文開始。
要理解這個(gè)問題,首先要知道算法的復(fù)雜度到底如何確定。什么時(shí)候我們認(rèn)為一個(gè)算法的復(fù)雜度高于另一個(gè)算法?什么時(shí)候兩個(gè)算法的復(fù)雜度其實(shí)是一樣的?
對于大部分算法來說,當(dāng)規(guī)模
趨于無窮大時(shí),問題的求解時(shí)間都會趨于無窮大。那么你說的這個(gè)無窮大,它到底有多大?復(fù)雜度的記法,我們當(dāng)然都知道使用大
或者大
。但是,這兩個(gè)符號,到底比較的是什么?這就是這篇文章首先要回答的問題。
一句話答案,我們所說的算法復(fù)雜度的大小,其實(shí)是算法復(fù)雜度的無窮大的階數(shù)。
也就是說,如果一個(gè)算法 A 的復(fù)雜度的無窮大階數(shù)比另一個(gè)算法 B 的無窮大階數(shù)小,也就是說
,那么此時(shí) A 的復(fù)雜度更小。下面舉幾個(gè)例子: ,所以
的算法比
的算法更優(yōu)
,所以
的算法比
的算法更優(yōu)
但是如果一個(gè)算法的復(fù)雜度函數(shù)比另一個(gè)算法的復(fù)雜度函數(shù)小,但他倆的無窮大階數(shù)一樣,那么其實(shí)兩個(gè)算法的復(fù)雜度是一樣的。這里也有幾個(gè)例子: ,2 是常數(shù)。所以
的算法與
的算法復(fù)雜度一樣
,4 是常數(shù)。所以
的算法與
的算法復(fù)雜度一樣
好了,我們已經(jīng)知道如何比較兩個(gè)算法復(fù)雜度了。現(xiàn)在我們來看看為什么三分不比二分快。
答案很簡單:二分法和三分法的漸進(jìn)復(fù)雜度是一樣的。
二分法的漸進(jìn)復(fù)雜度為
,三分法的漸進(jìn)復(fù)雜度為
,這兩個(gè)復(fù)雜度都沒有問題。那為什么說這兩個(gè)是一樣的呢?
看起來就是比
小,而且算出來也確實(shí)小很多啊?
Talk is cheap,讓我們直接來比較一下它們的無窮大階數(shù):
是個(gè)常數(shù),因此,兩個(gè)函數(shù)是同階無窮大。二分法和三分法的漸進(jìn)復(fù)雜度其實(shí)是一樣的。
這個(gè)結(jié)論也可以推廣一下。任意取兩個(gè)對數(shù)函數(shù)
與
,比較它們的無窮大階數(shù)都會得到
,是個(gè)常數(shù)。因此對數(shù)函數(shù)的底對于算法的復(fù)雜度分析是沒有意義的。
因此,無論是二分法,三分法,四分法,五分法...復(fù)雜度都是一樣的,分的越多,代碼反而越復(fù)雜,提高你的人腦處理復(fù)雜度,不值不值。
那么,這么看來,
和
是一樣的,
和
是一樣的。那算法復(fù)雜度分析時(shí),常數(shù)都不重要嗎?
并不是。
最常見的反例,
與
顯然復(fù)雜度不同。因?yàn)?
,
是更低階的無窮大。
當(dāng)然,大部分人可能不會在
與
的比較上犯錯(cuò)誤,但是下面這個(gè)比較,錯(cuò)的人就不少了。
和
哪個(gè)復(fù)雜度更大?
很多人以為這兩個(gè)復(fù)雜度是一樣的,因?yàn)槌?shù)不在指數(shù)位置上,看起來只是不同的常數(shù)做了指數(shù)操作,而常數(shù)一般對算法的復(fù)雜度沒有影響。
但是實(shí)際上
的無窮大階數(shù)比
要小。這兩者復(fù)雜度并不一樣。
而有人可能還覺得,就算復(fù)雜度不一樣,可能也差不太多吧?都是指數(shù)函數(shù),本身復(fù)雜度已經(jīng)很高了啊?
但是實(shí)際上并不是這樣。我們可以把
,
,
和
放到一起比較一下。
相對于
,很多人已經(jīng)認(rèn)為是增長了太多,不太能接受了。那么
相對于
增長了多少呢?我們其實(shí)可以比較一下這兩個(gè)“增長”之間的無窮大階數(shù)。
可見, 比
差,但是它們之間相差的時(shí)間倍數(shù)只是在線性增長。而
相對于
,相差的則更多,它們之間相差的時(shí)間倍數(shù)還是在指數(shù)增長!
這是什么概念呢?
如果有一個(gè)問題規(guī)模為
,
算法可以用 1 秒解決,那么使用
的算法,你需要 20 秒才能解決。這已經(jīng)讓大部分人無法接受了。
但是,如果有一個(gè)問題規(guī)模為
,
算法可以用 1 秒解決,那么使用
的算法,你需要 3325 秒才能解決!
所以,你現(xiàn)在還覺得,
和
差不多嗎?
總結(jié)
以上是生活随笔為你收集整理的二分检索用途及复杂性_二分查找和三分查找哪个快?算法复杂度与常数无关?复杂度分析的常见误区...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 建站需求_python建站
- 下一篇: java 添加图片背景_java添加背景