日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

一套图 搞懂“时间复杂度”(转载)

發(fā)布時(shí)間:2025/4/5 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一套图 搞懂“时间复杂度”(转载) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文轉(zhuǎn)載自https://blog.csdn.net/qq_41523096/article/details/82142747,感謝博主,如有侵權(quán),請聯(lián)系我刪除

其實(shí)時(shí)間復(fù)雜度就是代碼的基本操作執(zhí)行次數(shù)

?

轉(zhuǎn)載的內(nèi)容

寫在前面:

這篇文章是在公眾號(hào): 程序員小灰 中發(fā)布的。是我到目前為止所看到的關(guān)于時(shí)間復(fù)雜度介紹的最好的文章,簡介 清晰 明了。

所以拿來po出來 僅供學(xué)習(xí)交流,如侵則刪。

現(xiàn)已將此文收錄至:?《數(shù)據(jù)結(jié)構(gòu)》C語言版 (清華嚴(yán)蔚敏考研版) 全書知識(shí)梳理


正文:?

?

?

?

時(shí)間復(fù)雜度的意義

?

究竟什么是時(shí)間復(fù)雜度呢?讓我們來想象一個(gè)場景:某一天,小灰和大黃同時(shí)加入了一個(gè)公司......

一天過后,小灰和大黃各自交付了代碼,兩端代碼實(shí)現(xiàn)的功能都差不多。大黃的代碼運(yùn)行一次要花100毫秒,內(nèi)存占用5MB。小灰的代碼運(yùn)行一次要花100秒,內(nèi)存占用500MB。于是......

由此可見,衡量代碼的好壞,包括兩個(gè)非常重要的指標(biāo):

1.運(yùn)行時(shí)間;

2.占用空間。

?

基本操作執(zhí)行次數(shù)

?

關(guān)于代碼的基本操作執(zhí)行次數(shù),我們用四個(gè)生活中的場景,來做一下比喻:

場景1:給小灰一條長10寸的面包,小灰每3天吃掉1寸,那么吃掉整個(gè)面包需要幾天?

答案自然是 3 X 10 = 30天。

如果面包的長度是 N 寸呢?

此時(shí)吃掉整個(gè)面包,需要 3 X n = 3n 天。

如果用一個(gè)函數(shù)來表達(dá)這個(gè)相對時(shí)間,可以記作?T(n) = 3n。

場景2:給小灰一條長16寸的面包,小灰每5天吃掉面包剩余長度的一半,第一次吃掉8寸,第二次吃掉4寸,第三次吃掉2寸......那么小灰把面包吃得只剩下1寸,需要多少天呢?

這個(gè)問題翻譯一下,就是數(shù)字16不斷地除以2,除幾次以后的結(jié)果等于1?這里要涉及到數(shù)學(xué)當(dāng)中的對數(shù),以2位底,16的對數(shù),可以簡寫為log16。

因此,把面包吃得只剩下1寸,需要 5 X log16 = 5 X 4 = 20 天。

如果面包的長度是 N 寸呢?

需要?5 X logn = 5logn天,記作?T(n) =?5logn。

場景3:給小灰一條長10寸的面包和一個(gè)雞腿,小灰每2天吃掉一個(gè)雞腿。那么小灰吃掉整個(gè)雞腿需要多少天呢?

答案自然是2天。因?yàn)橹徽f是吃掉雞腿,和10寸的面包沒有關(guān)系?。

如果面包的長度是 N 寸呢?

無論面包有多長,吃掉雞腿的時(shí)間仍然是2天,記作?T(n) = 2。

場景4:給小灰一條長10寸的面包,小灰吃掉第一個(gè)一寸需要1天時(shí)間,吃掉第二個(gè)一寸需要2天時(shí)間,吃掉第三個(gè)一寸需要3天時(shí)間.....每多吃一寸,所花的時(shí)間也多一天。那么小灰吃掉整個(gè)面包需要多少天呢?

答案是從1累加到10的總和,也就是55天。

如果面包的長度是 N 寸呢?

此時(shí)吃掉整個(gè)面包,需要 1+2+3+......+ n-1 + n = (1+n)*n/2 = 0.5n^2 + 0.5n。

記作?T(n) = 0.5n^2 + 0.5n。

上面所講的是吃東西所花費(fèi)的相對時(shí)間,這一思想同樣適用于對程序基本操作執(zhí)行次數(shù)的統(tǒng)計(jì)。剛才的四個(gè)場景,分別對應(yīng)了程序中最常見的四種執(zhí)行方式:

場景1:T(n) = 3n,執(zhí)行次數(shù)是線性的。

?
  • void?eat1(int?n){

  • ????for(int?i=0;?i<n;?i++){;

  • ????????System.out.println("等待一天");

  • ????????System.out.println("等待一天");

  • ????????System.out.println("吃一寸面包");

  • ????}

  • }

  • vo

  • 場景2:T(n) = 5logn,執(zhí)行次數(shù)是對數(shù)的。

    ?
  • void?eat2(int?n){

  • ???for(int?i=1;?i<n;?i*=2){

  • ???????System.out.println("等待一天");

  • ???????System.out.println("等待一天");

  • ???????System.out.println("等待一天");

  • ???????System.out.println("等待一天");

  • ???????System.out.println("吃一半面包");

  • ???}

  • }

  • 場景3:T(n) = 2,執(zhí)行次數(shù)是常量的。

    ?
  • void?eat3(int?n){

  • ???System.out.println("等待一天");

  • ???System.out.println("吃一個(gè)雞腿");

  • }

  • 場景4:T(n) = 0.5n^2 + 0.5n,執(zhí)行次數(shù)是一個(gè)多項(xiàng)式。

    ?
  • void?eat4(int?n){

  • ???for(int?i=0;?i<n;?i++){

  • ???????for(int?j=0;?j<i;?j++){

  • ???????????System.out.println("等待一天");

  • ???????}

  • ???????System.out.println("吃一寸面包");

  • ???}

  • }

  • ?

    漸進(jìn)時(shí)間復(fù)雜度

    ?

    有了基本操作執(zhí)行次數(shù)的函數(shù) T(n),是否就可以分析和比較一段代碼的運(yùn)行時(shí)間了呢?還是有一定的困難。

    比如算法A的相對時(shí)間是T(n)= 100n,算法B的相對時(shí)間是T(n)= 5n^2,這兩個(gè)到底誰的運(yùn)行時(shí)間更長一些?這就要看n的取值了。

    所以,這時(shí)候有了漸進(jìn)時(shí)間復(fù)雜度(asymptotic time complexity)的概念,官方的定義如下:

    若存在函數(shù) f(n),使得當(dāng)n趨近于無窮大時(shí),T(n)/ f(n)的極限值為不等于零的常數(shù),則稱 f(n)是T(n)的同數(shù)量級(jí)函數(shù)。

    記作?T(n)= O(f(n)),稱O(f(n)) 為算法的漸進(jìn)時(shí)間復(fù)雜度,簡稱時(shí)間復(fù)雜度。

    漸進(jìn)時(shí)間復(fù)雜度用大寫O來表示,所以也被稱為大O表示法。

    如何推導(dǎo)出時(shí)間復(fù)雜度呢?有如下幾個(gè)原則:

  • 如果運(yùn)行時(shí)間是常數(shù)量級(jí),用常數(shù)1表示;

  • 只保留時(shí)間函數(shù)中的最高階項(xiàng);

  • 如果最高階項(xiàng)存在,則省去最高階項(xiàng)前面的系數(shù)。

  • 讓我們回頭看看剛才的四個(gè)場景。

    場景1:

    T(n) = 3n?

    最高階項(xiàng)為3n,省去系數(shù)3,轉(zhuǎn)化的時(shí)間復(fù)雜度為:

    T(n) =? O(n)

    場景2:

    T(n) = 5logn?

    最高階項(xiàng)為5logn,省去系數(shù)5,轉(zhuǎn)化的時(shí)間復(fù)雜度為:

    T(n) =? O(logn)

    場景3:

    T(n) = 2

    只有常數(shù)量級(jí),轉(zhuǎn)化的時(shí)間復(fù)雜度為:

    T(n) =? O(1)

    場景4:

    T(n) = 0.5n^2 + 0.5n

    最高階項(xiàng)為0.5n^2,省去系數(shù)0.5,轉(zhuǎn)化的時(shí)間復(fù)雜度為:

    T(n) =? O(n^2)

    這四種時(shí)間復(fù)雜度究竟誰用時(shí)更長,誰節(jié)省時(shí)間呢?稍微思考一下就可以得出結(jié)論:

    O(1)<?O(logn)<?O(n)<?O(n^2)

    在編程的世界中有著各種各樣的算法,除了上述的四個(gè)場景,還有許多不同形式的時(shí)間復(fù)雜度,比如:

    O(nlogn),?O(n^3),?O(m*n),O(2^n),O(n!)

    今后遨游在代碼的海洋里,我們會(huì)陸續(xù)遇到上述時(shí)間復(fù)雜度的算法。

    ?

    時(shí)間復(fù)雜度的巨大差異

    ?

    ?

    我們來舉過一個(gè)栗子:

    算法A的相對時(shí)間規(guī)模是T(n)= 100n,時(shí)間復(fù)雜度是O(n)

    算法B的相對時(shí)間規(guī)模是T(n)= 5n^2,時(shí)間復(fù)雜度是O(n^2)

    算法A運(yùn)行在小灰家里的老舊電腦上,算法B運(yùn)行在某臺(tái)超級(jí)計(jì)算機(jī)上,運(yùn)行速度是老舊電腦的100倍。

    那么,隨著輸入規(guī)模 n 的增長,兩種算法誰運(yùn)行更快呢?

    從表格中可以看出,當(dāng)n的值很小的時(shí)候,算法A的運(yùn)行用時(shí)要遠(yuǎn)大于算法B;當(dāng)n的值達(dá)到1000左右,算法A和算法B的運(yùn)行時(shí)間已經(jīng)接近;當(dāng)n的值越來越大,達(dá)到十萬、百萬時(shí),算法A的優(yōu)勢開始顯現(xiàn),算法B則越來越慢,差距越來越明顯。

    這就是不同時(shí)間復(fù)雜度帶來的差距。

    總結(jié)

    以上是生活随笔為你收集整理的一套图 搞懂“时间复杂度”(转载)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。