數(shù)據(jù)結(jié)構(gòu)第一篇:算法效率的度量

作為一個(gè)iOS開(kāi)發(fā)者,其實(shí)是很少用到算法的,但是算法是計(jì)算機(jī)運(yùn)算的基礎(chǔ),雖然我們平時(shí)開(kāi)發(fā)中很少使用,但是想要對(duì)軟件開(kāi)發(fā)有更加深入的研究,那么必須要了解一下算法,了解算法,我們可以知道程序的最佳運(yùn)行效率,還可以知道我們程序是否高效

許多朋友其實(shí)是不知道我們寫(xiě)的程序的運(yùn)行效率的(包括我,在今天之前也是不知道的),今天就讓我們首先學(xué)習(xí)一下怎么知道我們程序的運(yùn)行效率。

算法效率的度量方法

我們常說(shuō)設(shè)計(jì)算法要提高效率,但是我們?cè)趺磥?lái)知道我們的算法效率是多少呢,有兩個(gè)最常見(jiàn)的方法

  • 1、利用記時(shí)功能,我們寫(xiě)幾個(gè)算法,然后用計(jì)時(shí)器對(duì)不同的算法編程運(yùn)行,進(jìn)行時(shí)間比較,從而確定算法效率的高低

這個(gè)其實(shí)有一點(diǎn)不怎么靠譜,首先即使能夠比較出來(lái)哪種算法比較快,但是我們還是不清楚為啥這種算法會(huì)快一點(diǎn);其次現(xiàn)在CPU運(yùn)行效率都比較快,如果是幾百幾千很有可能根本就區(qū)分不出來(lái)。所以這種方法基本排除了

  • 2、事前估算,在程序運(yùn)行之前,運(yùn)用統(tǒng)計(jì)的方法對(duì)算法進(jìn)行估算,這種還是比較準(zhǔn)確的

一個(gè)高級(jí)程序語(yǔ)言編寫(xiě)的程序在計(jì)算機(jī)運(yùn)行所消耗的時(shí)間取決于一下幾點(diǎn)

  • 1、算法采用的方法
  • 2、編譯產(chǎn)生的代碼量
  • 3、問(wèn)題的輸入規(guī)模
  • 4、機(jī)器執(zhí)行指令的速度

第一條是算法好壞的根本,第二條由軟件決定,第四條由硬件性能決定,拋開(kāi)硬件與軟件因素,決定一個(gè)算法效率的因素是算法采用的方法和問(wèn)題的輸入規(guī)模問(wèn)題的輸入規(guī)模

現(xiàn)在我們就舉三個(gè)例子來(lái)說(shuō)明一下問(wèn)題


E35F2694-9962-474B-9DB5-8BAA2493BE8E.png

首先我們先看前兩種算法,其實(shí)他們的效果都是一樣的,都是計(jì)算從1加到100的值,但是第一種算法執(zhí)行了n+2次,而第二種算法執(zhí)行了3次。算法效率不用比都知道是哪一種的效率高了。

我們?cè)趤?lái)對(duì)三種算法進(jìn)行比較,發(fā)現(xiàn)其實(shí)三種算法效率的高低主要是由核心也就是中間部分決定,我們?nèi)サ粝嗤牟糠?,可以看?br> f(n)1 = n
f(n)2 = 1
f(n)3 = n*n

隨著n的增大,他們之間的效率相差也是越大。

到這里,我們來(lái)介紹一下這篇文章的核心概念算法時(shí)間復(fù)雜度

概念:在進(jìn)行算法分析的時(shí)候,語(yǔ)句總的執(zhí)行次數(shù)T(n)是關(guān)于問(wèn)題規(guī)模n的函數(shù),進(jìn)而分析T(n)隨n的變化情況并確定T(n)的數(shù)量級(jí)。算法時(shí)間復(fù)雜度,也就是算法的時(shí)間度量,記著:T(n) = O (f(n))。它表示隨問(wèn)題規(guī)模n的增大,算法執(zhí)行時(shí)間的增長(zhǎng)率和f(n)的增長(zhǎng)率相同,稱(chēng)作為算法漸進(jìn)時(shí)間復(fù)雜度,簡(jiǎn)稱(chēng)時(shí)間復(fù)雜度

這樣大寫(xiě)OO()來(lái)體現(xiàn)算法時(shí)間復(fù)雜度的記法,我們稱(chēng)作為大O記法

由此時(shí)間復(fù)雜度的記法的定義可知我們上面的三種算法的時(shí)間復(fù)雜度分別為O(n) O(1) O(n* n)。其中O(1)叫常數(shù)階,O(n)叫線(xiàn)性階,O(n* n)叫平方階

推導(dǎo)大O記法

  • 1、用常數(shù)1來(lái)取代運(yùn)行時(shí)間中所有的加法常數(shù)
  • 2、在修改后的運(yùn)行次數(shù)函數(shù)中,只保留最高階
  • 3、如果最高階項(xiàng)存在但不是1,去除最高階相乘的常數(shù)

一些時(shí)間復(fù)雜度解釋


EDFCCA98-3700-4EF2-8112-EB5E051A3C30.png

時(shí)間復(fù)雜度所消耗的時(shí)間排序

0(1)<O(logn)<O(n)<O(nlogn)<0(n2 ) <0(n3 ) <0(2")<O(n!)<O(nn)

結(jié)束語(yǔ)

很多程序猿做了很多年的編程,但是還是不怎么清楚算法的時(shí)間復(fù)雜度的估算,其實(shí)這是一個(gè)很可悲的事情,因?yàn)榕磺宄惴〞r(shí)間復(fù)雜度,所以也就從來(lái)不深究自己寫(xiě)代碼的效率是否低下。

有一些人經(jīng)常給自己的借口是,現(xiàn)在CPU越來(lái)越快,不怎么需要改進(jìn)算法,而且用戶(hù)也感受不到算法好壞對(duì)程序的影響,可事實(shí)真是這樣嗎,即使CPU短時(shí)間內(nèi)提高了100倍,但是我們一個(gè)O(n)的算法寫(xiě)出了O(n*n)的程序,當(dāng)n=100的時(shí)候,那就相差100倍了,不要說(shuō)更加復(fù)雜的算法了。

文章結(jié)束語(yǔ)摘錄自:大話(huà)數(shù)據(jù)結(jié)構(gòu),其實(shí)文章的內(nèi)容也是根據(jù)大話(huà)數(shù)據(jù)結(jié)構(gòu)寫(xiě)出來(lái)的,有空的同學(xué)也可以讀以下這本書(shū),感覺(jué)書(shū)寫(xiě)的還是挺通俗易懂的

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容