chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一文讀懂?dāng)?shù)據(jù)結(jié)構(gòu)中的算法

算法與數(shù)據(jù)結(jié)構(gòu) ? 來(lái)源:互聯(lián)網(wǎng) ? 作者:佚名 ? 2017-11-15 15:19 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、前言

在進(jìn)一步學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法前,我們應(yīng)該先掌握算法分析的一般方法。算法分析主要包括對(duì)算法的時(shí)空復(fù)雜度進(jìn)行分析,但有些時(shí)候我們更關(guān)心算法的實(shí)際運(yùn)行性能如何,此外,算法可視化是一項(xiàng)幫助我們理解算法實(shí)際執(zhí)行過(guò)程的實(shí)用技能,在分析一些比較抽象的算法時(shí),這項(xiàng)技能尤為實(shí)用。


在本文中,我們首先會(huì)介紹如何通過(guò)設(shè)計(jì)實(shí)驗(yàn)來(lái)量化算法的實(shí)際運(yùn)行性能,然后會(huì)介紹算法的時(shí)間復(fù)雜度的分析方法,我們還會(huì)介紹能夠非常便捷的預(yù)測(cè)算法性能的倍率實(shí)驗(yàn)。當(dāng)然,在文章的末尾,我們會(huì)一起來(lái)做幾道一線互聯(lián)網(wǎng)的相關(guān)面試/筆試題來(lái)鞏固所學(xué),達(dá)到學(xué)以致用。

二、算法分析的一般方法

1、量化算法的實(shí)際運(yùn)行性能

在介紹算法的時(shí)空復(fù)雜度分析方法前,我們先來(lái)介紹以下如何來(lái)量化算法的實(shí)際運(yùn)行性能,這里我們選取的衡量算法性能的量化指標(biāo)是它的實(shí)際運(yùn)行時(shí)間。通常這個(gè)運(yùn)行時(shí)間與算法要解決的問(wèn)題規(guī)模相關(guān),比如排序100萬(wàn)個(gè)數(shù)的時(shí)間通常要比排序10萬(wàn)個(gè)數(shù)的時(shí)間要長(zhǎng)。所以我們?cè)谟^察算法的運(yùn)行時(shí)間時(shí),還要同時(shí)考慮它所解決問(wèn)題的規(guī)模,觀察隨著問(wèn)題規(guī)模的增長(zhǎng),算法的實(shí)際運(yùn)行時(shí)間時(shí)怎樣增長(zhǎng)的。這里我們采用算法(第4版) (豆瓣)一書(shū)中的例子,代碼如下:

public class ThreeSum {  
  public static int count(int[] a) {  
    int N = a.length;  
    int cnt = 0;  
    for (int i = 0; i < N; i++) { ? 
 ? ? ? ? ? ?for (int j = i + 1; j < N; j++) { ? 
 ? ? ? ? ? ? ? ?for (int k = j + 1; k < N; k++) { ? 
 ? ? ? ? ? ? ? ? ? ?if (a[i] + a[j] + a[k] == 0) {  
            cnt++;  
          }  
        }  
      }  
    }  
    return cnt;  
  }  

  public static void main(String[] args) {  
    int[] a = StdIn.readAllInts();  
    StdOut.println(count(a));  
  }  
}

以上代碼用到的StdIn和StdOut這兩個(gè)類(lèi)都在這里:

https://github.com/absfree/Algo。我們可以看到,以上代碼的功能是統(tǒng)計(jì)標(biāo)準(zhǔn)一個(gè)int[]數(shù)組中的所有和為0的三整數(shù)元組的數(shù)量。采用的算法十分直接,就是從頭開(kāi)始遍歷數(shù)組,每次取三個(gè)數(shù),若和為0,則計(jì)數(shù)加一,最后返回的計(jì)數(shù)值即為和為0的三元組的數(shù)量。這里我們采取含有整數(shù)數(shù)量分別為1000、2000、4000的3個(gè)文件(這些文件可以在上面的項(xiàng)目地址中找到),來(lái)對(duì)以上算法進(jìn)行測(cè)試,觀察它的運(yùn)行時(shí)間隨著問(wèn)題規(guī)模的增長(zhǎng)是怎樣變化的。

測(cè)量一個(gè)過(guò)程的運(yùn)行時(shí)間的一個(gè)直接的方法就是,在這個(gè)過(guò)程運(yùn)行前后各獲取一次當(dāng)前時(shí)間,兩者的差值即為這個(gè)過(guò)程的運(yùn)行時(shí)間。當(dāng)我們的過(guò)程本身需要的執(zhí)行時(shí)間很短時(shí)間,這個(gè)測(cè)量方法可能會(huì)存在一些誤差,但是我們可以通過(guò)執(zhí)行多次這個(gè)過(guò)程再取平均數(shù)來(lái)減小以至可以忽略這個(gè)誤差。下面我們來(lái)實(shí)際測(cè)量一下以上算法的運(yùn)行時(shí)間,相關(guān)代碼如下:

public static void main(String[] args) {  
    int[] a = In.readInts(args[0]);  
    long startTime = System.currentTimeMillis();  
    int count = count(a);  
    long endTime = System.currentTimeMillis();  
    double time = (endTime - startTime) / 1000.0;  
    StdOut.println("The result is: " + count + ", and takes " + time + " seconds.");  
  }

我們分別以1000、2000、4000個(gè)整數(shù)作為輸入,得到的運(yùn)行結(jié)果如下

The result is: 70, and takes 1.017 seconds. //1000個(gè)整數(shù)  The result is: 528, and takes 7.894 seconds. //2000個(gè)整數(shù)  The result is: 4039, and takes 64.348 seconds. //4000個(gè)整數(shù)

我們從以上結(jié)果大概可你看到,當(dāng)問(wèn)題的規(guī)模變?yōu)樵瓉?lái)的2倍時(shí),實(shí)際運(yùn)行時(shí)間大約變?yōu)樵瓉?lái)的8倍。根據(jù)這個(gè)現(xiàn)象我們可以做出一個(gè)猜想:程序的運(yùn)行時(shí)間關(guān)于問(wèn)題規(guī)模N的函數(shù)關(guān)系式為T(mén)(N) = k*(n^3).

在這個(gè)關(guān)系式中,當(dāng)n變?yōu)樵瓉?lái)的2倍時(shí),T(N)會(huì)變?yōu)樵瓉?lái)的8倍。那么ThreeSum算法的運(yùn)行時(shí)間與問(wèn)題規(guī)模是否滿足以上的函數(shù)關(guān)系呢?在介紹算法時(shí)間復(fù)雜度的相關(guān)內(nèi)容后,我們會(huì)回過(guò)頭來(lái)再看這個(gè)問(wèn)題。

2、算法的時(shí)間復(fù)雜度分析

(1)基本概念

關(guān)于算法的時(shí)間復(fù)雜度,這里我們先簡(jiǎn)單介紹下相關(guān)的三種符號(hào)記法:

  • 第一種叫Big O notation,它給出了運(yùn)行時(shí)間的”漸進(jìn)上界“,也就是算法在最壞情況下運(yùn)行時(shí)間的上限。它的定義如下:對(duì)于f(n)和g(n),若存在常數(shù)c和N0,使得對(duì)于所有n > N0,都有 |f(n)| < c * g(n),則稱(chēng)f(n)為O(g(n)。

  • 第三種叫做BigΩ notation,它給出了運(yùn)行時(shí)間的“漸進(jìn)下界”,也就是算法在最壞情況下運(yùn)行時(shí)間的下限。它的定義如下:對(duì)于f(n)和g(n),若存在常數(shù)c和N0,使得對(duì)于所有n > N0,都有|f(n)| > c * g(n),則稱(chēng)f(n)為Ω(g(n))。

  • 第三種叫BigΘ notation,它確定了運(yùn)行時(shí)間的”漸進(jìn)確界“。定義如下:對(duì)于f(n)和g(n),若存在常數(shù)c和N0,對(duì)于所有n> N0,都有|f(n)| = c * g(n),則稱(chēng)f(n)為Θ為Θ(g(n))。

我們?cè)谄匠5乃惴ǚ治鲋凶畛S玫降氖荁ig O notation。下面我們將介紹分析算法的時(shí)間復(fù)雜度的具體方法,若對(duì)Big O notation的概念還不是很了解,推薦大家看這篇文章:http://blog.jobbole.com/55184/。

(2)時(shí)間復(fù)雜度的分析方法

這部分我們將以上面的ThreeSum程序?yàn)槔?,?lái)介紹一下算法時(shí)間復(fù)雜度的分析方法。為了方便閱讀,這里再貼一下上面的程序:

public static int count(int[] a) {  
    int N = a.length;  
    int cnt = 0;  
    for (int i = 0; i < N; i++) { ? 
 ? ? ? ? ? ?for (int j = i + 1; j < N; j++) { ? 
 ? ? ? ? ? ? ? ?for (int k = j + 1; k < N; k++) { ? 
 ? ? ? ? ? ? ? ? ? ?if (a[i] + a[j] + a[k] == 0) {  
            cnt++;  
          }  
        }  
      }  
    }  
    return cnt;  
  }

在介紹時(shí)間復(fù)雜度分析方法前,我們首先來(lái)明確下算法的運(yùn)行時(shí)間究竟取決于什么。直觀地想,一個(gè)算法的運(yùn)行時(shí)間也就是執(zhí)行所有程序語(yǔ)句的耗時(shí)總和。然而在實(shí)際的分析中,我們并不需要考慮所有程序語(yǔ)句的運(yùn)行時(shí)間,我們應(yīng)該做的是集中注意力于最耗時(shí)的部分,也就是執(zhí)行頻率最高而且最耗時(shí)的操作。也就是說(shuō),在對(duì)一個(gè)程序的時(shí)間復(fù)雜度進(jìn)行分析前,我們要先確定這個(gè)程序中哪些語(yǔ)句的執(zhí)行占用的它的大部分執(zhí)行時(shí)間,而那些盡管耗時(shí)大但只執(zhí)行常數(shù)次(和問(wèn)題規(guī)模無(wú)關(guān))的操作我們可以忽略。我們選出一個(gè)最耗時(shí)的操作,通過(guò)計(jì)算這些操作的執(zhí)行次數(shù)來(lái)估計(jì)算法的時(shí)間復(fù)雜度,下面我們來(lái)具體介紹這一過(guò)程。

首先我們看到以上代碼的第1行和第2行的語(yǔ)句只會(huì)執(zhí)行一次,因此我們可以忽略它們。然后我們看到第4行到第12行是一個(gè)三層循環(huán),最內(nèi)存的循環(huán)體包含了一個(gè)if語(yǔ)句。也就是說(shuō),這個(gè)if語(yǔ)句是以上代碼中耗時(shí)最多的語(yǔ)句,我們接下來(lái)只需要計(jì)算if語(yǔ)句的執(zhí)行次數(shù)即可估計(jì)出這個(gè)算法的時(shí)間復(fù)雜度。以上算法中,我們的問(wèn)題規(guī)模為N(輸入數(shù)組包含的元素?cái)?shù)目),我們也可以看到,if語(yǔ)句的執(zhí)行次數(shù)與N是相關(guān)的。我們不難得出,if語(yǔ)句會(huì)執(zhí)行N * (N - 1) * (N - 2) / 6次,因此這個(gè)算法的時(shí)間復(fù)雜度為O(n^3)。這也印證了我們之前猜想的運(yùn)行時(shí)間與問(wèn)題規(guī)模的函數(shù)關(guān)系(T(n) = k * n ^ 3)。由此我們也可以知道,算法的時(shí)間復(fù)雜度刻畫(huà)的是隨著問(wèn)題規(guī)模的增長(zhǎng),算法的運(yùn)行時(shí)間的增長(zhǎng)速度是怎樣的。在平常的使用中,Big O notation通常都不是嚴(yán)格表示最壞情況下算法的運(yùn)行時(shí)間上限,而是用來(lái)表示通常情況下算法的漸進(jìn)性能的上限,在使用Big O notation描述算法最壞情況下運(yùn)行時(shí)間的上限時(shí),我們通常加上限定詞“最壞情況“。

通過(guò)以上分析,我們知道分析算法的時(shí)間復(fù)雜度只需要兩步(比把大象放進(jìn)冰箱還少一步:) ):

  • 尋找執(zhí)行次數(shù)多的語(yǔ)句作為決定運(yùn)行時(shí)間的[關(guān)鍵操作];

  • 分析關(guān)鍵操作的執(zhí)行次數(shù)。

在以上的例子中我們可以看到,不論我們輸入的整型數(shù)組是怎樣的,if語(yǔ)句的執(zhí)行次數(shù)是不變的,也就是說(shuō)上面算法的運(yùn)行時(shí)間與輸入無(wú)關(guān)。而有些算法的實(shí)際運(yùn)行時(shí)間高度依賴(lài)于我們給定的輸入,關(guān)于這一問(wèn)題下面我們進(jìn)行介紹。

3、算法的期望運(yùn)行時(shí)間

算法的期望運(yùn)行時(shí)間我們可以理解為,在通常情況下,算法的運(yùn)行時(shí)間是多少。在很多時(shí)候,我們更關(guān)心算法的期望運(yùn)行時(shí)間而不是算法在最壞情況下運(yùn)行時(shí)間的上限,因?yàn)樽顗那闆r和最好情況發(fā)生的概率是比較低的,我們更常遇到的是一般情況。比如說(shuō)盡管快速排序算法與歸并排序算法的時(shí)間復(fù)雜度都為O(nlogn),但是在相同的問(wèn)題規(guī)模下,快速排序往往要比歸并排序快,因此快速排序算法的期望運(yùn)行時(shí)間要比歸并排序的期望時(shí)間小。然而在最壞情況下,快速排序的時(shí)間復(fù)雜度會(huì)變?yōu)镺(n^2),快速排序算法就是一個(gè)運(yùn)行時(shí)間依賴(lài)于輸入的算法,對(duì)于這個(gè)問(wèn)題,我們可以通過(guò)打亂輸入的待排序數(shù)組的順序來(lái)避免發(fā)生最壞情況。

4、倍率實(shí)驗(yàn)

下面我們來(lái)介紹一下算法(第4版) (豆瓣)一書(shū)中的“倍率實(shí)驗(yàn)”。這個(gè)方法能夠簡(jiǎn)單有效地預(yù)測(cè)程序的性能并判斷他們的運(yùn)行時(shí)間大致的增長(zhǎng)數(shù)量級(jí)。在正式介紹倍率實(shí)驗(yàn)前,我們先來(lái)簡(jiǎn)單介紹下“增長(zhǎng)數(shù)量級(jí)“這一概念(同樣引用自《算法》一書(shū)):

我們用~f(N)表示所有隨著N的增大除以f(N)的結(jié)果趨于1的函數(shù)。用g(N)~f(N)表示g(N) / f(N)隨著N的增大趨近于1。通常我們用到的近似方式都是g(N) ~ a * f(N)。我們將f(N)稱(chēng)為g(N)的增長(zhǎng)數(shù)量級(jí)。

我們還是拿ThreeSum程序來(lái)舉例,假設(shè)g(N)表示在輸入數(shù)組尺寸為N時(shí)執(zhí)行if語(yǔ)句的次數(shù)。根據(jù)以上的定義,我們就可以得到g(N) ~ N ^ 3(當(dāng)N趨向于正無(wú)窮時(shí),g(N) / N^3 趨近于1)。所以g(N)的增長(zhǎng)數(shù)量級(jí)為N^3,即ThreeSum算法的運(yùn)行時(shí)間的增長(zhǎng)數(shù)量級(jí)為N^3。

現(xiàn)在,我們來(lái)正式介紹倍率實(shí)驗(yàn)(以下內(nèi)容主要引用自上面提到的《算法》一書(shū),同時(shí)結(jié)合了一些個(gè)人理解)。首先我們來(lái)一個(gè)熱身的小程序:

public class DoublingTest {  
  public static double timeTrial(int N) {  
    int MAX = 1000000;  
    int[] a = new int[N];  
    for (int i = 0; i < N; i++) { ? 
 ? ? ? ? ? ?a[i] = StdRandom.uniform(-MAX, MAX); ? 
 ? ? ? ?} ? 
 ? ? ? ?long startTime = System.currentTimeMillis();  
    int count = ThreeSum.count(a);  
    long endTime = System.currentTimeMillis();  
    double time = (endTime - startTime) / 1000.0;  
    return time;  
  }  

  public static void main(String[] args) {  
    for (int N = 250; true; N += N) {  
      double time = timeTrial(N);  
      StdOut.printf("%7d %5.1f\n", N, time);  
    }  
  }  
}

以上代碼會(huì)以250為起點(diǎn),每次講ThreeSum的問(wèn)題規(guī)模翻一倍,并在每次運(yùn)行ThreeSum后輸出本次問(wèn)題規(guī)模和對(duì)應(yīng)的運(yùn)行時(shí)間。運(yùn)行以上程序得到的輸出如下所示:

250 0.0   500 0.1   1000 0.6   2000 4.3   4000 30.6

上面的輸出之所以和理論值有所出入是因?yàn)閷?shí)際運(yùn)行環(huán)境是復(fù)雜多變的,因而會(huì)產(chǎn)生許多偏差,盡可能減小這種偏差的方式就是多次運(yùn)行以上程序并取平均值。有了上面這個(gè)熱身的小程序做鋪墊,接下來(lái)我們就可以正式介紹這個(gè)“可以簡(jiǎn)單有效地預(yù)測(cè)任意程序執(zhí)行性能并判斷其運(yùn)行時(shí)間的大致增長(zhǎng)數(shù)量級(jí)”的方法了,實(shí)際上它的工作基于以上的DoublingTest程序,大致過(guò)程如下:

  • 開(kāi)發(fā)一個(gè)[輸入生成器]來(lái)產(chǎn)生實(shí)際情況下的各種可能的輸入。

  • 反復(fù)運(yùn)行下面的DoublingRatio程序,直至time/prev的值趨近于極限2^b,則該算法的增長(zhǎng)數(shù)量級(jí)約為N^b(b為常數(shù))。

DoublingRatio程序如下:

運(yùn)行倍率程序,我們可以得到如下輸出:

0.0 2.0  0.1 5.5  0.5 5.4  3.7 7.0  27.4 7.4  218.0 8.0

我們可以看到,time/prev確實(shí)收斂到了8(2^3)。那么,為什么通過(guò)使輸入不斷翻倍而反復(fù)運(yùn)行程序,運(yùn)行時(shí)間的比例會(huì)趨于一個(gè)常數(shù)呢?答案是下面的[倍率定理]:

若T(N) ~ a * N^b * lgN,那么T(2N) / T(N) ~2^b。

以上定理的證明很簡(jiǎn)單,只需要計(jì)算T(2N) / T(N)在N趨向于正無(wú)窮時(shí)的極限即可。其中,“a * N^b * lgN”基本上涵蓋了常見(jiàn)算法的增長(zhǎng)量級(jí)(a、b為常數(shù))。值得我們注意的是,當(dāng)一個(gè)算法的增長(zhǎng)量級(jí)為NlogN時(shí),對(duì)它進(jìn)行倍率測(cè)試,我們會(huì)得到它的運(yùn)行時(shí)間的增長(zhǎng)數(shù)量級(jí)約為N。實(shí)際上,這并不矛盾,因?yàn)槲覀儾⒉荒芨鶕?jù)倍率實(shí)驗(yàn)的結(jié)果推測(cè)出算法符合某個(gè)特定的數(shù)學(xué)模型,我們只能夠大致預(yù)測(cè)相應(yīng)算法的性能(當(dāng)N在16000到32000之間時(shí),14N與NlgN十分接近)。

5、均攤分析

考慮下我們之前在 深入理解數(shù)據(jù)結(jié)構(gòu)之鏈表 中提到的ResizingArrayStack,也就是底層用數(shù)組實(shí)現(xiàn)的支持動(dòng)態(tài)調(diào)整大小的棧。每次添加一個(gè)元素到棧中后,我們都會(huì)判斷當(dāng)前元素是否填滿的數(shù)組,若是填滿了,則創(chuàng)建一個(gè)尺寸為原來(lái)兩倍的新數(shù)組,并把所有元素從原數(shù)組復(fù)制到新數(shù)組中。我們知道,在數(shù)組未填滿的情況下,push操作的復(fù)雜度為O(1),而當(dāng)一個(gè)push操作使得數(shù)組被填滿,創(chuàng)建新數(shù)組及復(fù)制這一工作會(huì)使得push操作的復(fù)雜度驟然上升到O(n)。

對(duì)于上面那種情況,我們顯然不能說(shuō)push的復(fù)雜度是O(n),我們通常認(rèn)為push的“平均復(fù)雜度”為O(1),因?yàn)楫吘姑縩個(gè)push操作才會(huì)觸發(fā)一次“復(fù)制元素到新數(shù)組”,因而這n個(gè)push把這一代價(jià)一均攤,對(duì)于這一系列push中的每個(gè)來(lái)說(shuō),它們的均攤代價(jià)就是O(1)。這種記錄所有操作的總成本并除以操作總數(shù)來(lái)講成本均攤的方法叫做均攤分析(也叫攤還分析)。

三、小試牛刀之實(shí)戰(zhàn)名企面試題

前面我們介紹了算法分析的一些姿勢(shì),那么現(xiàn)在我們就來(lái)學(xué)以致用,一起來(lái)解決幾道一線互聯(lián)網(wǎng)企業(yè)有關(guān)于算法分析的面試/筆試題。

【騰訊】下面算法的時(shí)間復(fù)雜度是____

int foo(int n) {

if (n <= 1) {

return 1;

}

return n * foo(n - 1);

}

看到這道題要我們分析算法時(shí)間復(fù)雜度后,我們要做的第一步便是確定關(guān)鍵操作,這里的關(guān)鍵操作顯然是if語(yǔ)句,那么我們只需要判斷if語(yǔ)句執(zhí)行的次數(shù)即可。首先我們看到這是一個(gè)遞歸過(guò)程:foo會(huì)不斷的調(diào)用自身,直到foo的實(shí)參小于等于1,foo就會(huì)返回1,之后便不會(huì)再執(zhí)行if語(yǔ)句了。由此我們可以知道,if語(yǔ)句調(diào)用的次數(shù)為n次,所以時(shí)間復(fù)雜度為O(n)。

【京東】以下函數(shù)的時(shí)間復(fù)雜度為_(kāi)___

void recursive(int n, int m, int o) {

if (n <= 0) {

printf("%d, %d\n", m, o);

} else {

recursive(n - 1, m + 1, o);

recursive(n - 1, m, o + 1);

}

}

這道題明顯要比上道題難一些,那么讓我們來(lái)按部就班的解決它。首先,它的關(guān)鍵操作時(shí)if語(yǔ)句,因此我們只需判斷出if語(yǔ)句的執(zhí)行次數(shù)即可。以上函數(shù)會(huì)在n > 0的時(shí)候不斷遞歸調(diào)用自身,我們要做的是判斷在到達(dá)遞歸的base case(即n <= 0)前,共執(zhí)行了多少次if語(yǔ)句。我們假設(shè)if語(yǔ)句的執(zhí)行次數(shù)為T(mén)(n, m, o),那么我們可以進(jìn)一步得到:T(n, m, o) = T(n-1, m+1, o) + T(n-1, m, o+1) (當(dāng)n > 0時(shí))。我們可以看到base case與參數(shù)m, o無(wú)關(guān),因此我們可以把以上表達(dá)式進(jìn)一步簡(jiǎn)化為T(mén)(n) = 2T(n-1),由此我們可得T(n) = 2T(n-1) = (2^2) * T(n-2)......所以我們可以得到以上算法的時(shí)間復(fù)雜度為O(2^n)。

【京東】如下程序的時(shí)間復(fù)雜度為_(kāi)___(其中m > 1,e > 0)

x = m;

y = 1;

while (x - y > e) {

x = (x + y) / 2;

y = m / x;

}

print(x);

以上算法的關(guān)鍵操作即while語(yǔ)句中的兩條賦值語(yǔ)句,我們只需要計(jì)算這兩條語(yǔ)句的執(zhí)行次數(shù)即可。我們可以看到,當(dāng)x - y > e時(shí),while語(yǔ)句體內(nèi)的語(yǔ)句就會(huì)執(zhí)行,x = (x + y) / 2使得x不斷變?。ó?dāng)y<

【搜狗】假設(shè)某算法的計(jì)算時(shí)間可用遞推關(guān)系式T(n) = 2T(n/2) + n,T(1) = 1表示,則該算法的時(shí)間復(fù)雜度為_(kāi)___

根據(jù)題目給的遞推關(guān)系式,我們可以進(jìn)一步得到:T(n) = 2(2T(n/4) + n/2) + n = ... 將遞推式進(jìn)一步展開(kāi),我們可以得到該算法的時(shí)間復(fù)雜度為O(nlogn),這里就不貼上詳細(xì)過(guò)程了。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4710

    瀏覽量

    95392
  • 數(shù)據(jù)結(jié)構(gòu)

    關(guān)注

    3

    文章

    573

    瀏覽量

    40749
  • 量化算法
    +關(guān)注

    關(guān)注

    0

    文章

    4

    瀏覽量

    6518

原文標(biāo)題:算法分析的正確姿勢(shì)

文章出處:【微信號(hào):TheAlgorithm,微信公眾號(hào):算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    數(shù)據(jù)結(jié)構(gòu)算法分析(Java版)(pdf)

    數(shù)據(jù)結(jié)構(gòu)算法分析(Java版)(pdf)http://www.ibeifeng.com/read.php?tid=4812&u=73481【中文】Java數(shù)據(jù)結(jié)構(gòu)算法中文第
    發(fā)表于 12-20 21:22

    數(shù)據(jù)結(jié)構(gòu)算法分析

    數(shù)據(jù)結(jié)構(gòu)算法分析
    發(fā)表于 06-05 10:46

    數(shù)據(jù)結(jié)構(gòu)教程,下載

    1. 數(shù)據(jù)結(jié)構(gòu)的基本概念 2. 算法數(shù)據(jù)結(jié)構(gòu)3. C語(yǔ)言的數(shù)據(jù)類(lèi)型及其算法描述要點(diǎn)4. 學(xué)習(xí)算法
    發(fā)表于 05-14 17:22 ?0次下載
    <b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>教程,下載

    數(shù)據(jù)結(jié)構(gòu)算法習(xí)題

    數(shù)據(jù)結(jié)構(gòu)算法習(xí)題,ACM專(zhuān)用,刷題初期按照這個(gè)地方刷很好
    發(fā)表于 03-03 18:25 ?0次下載

    數(shù)據(jù)結(jié)構(gòu)算法

    全國(guó)C語(yǔ)言考試公共基礎(chǔ)知識(shí)點(diǎn)——數(shù)據(jù)結(jié)構(gòu)算法,該資料包含了有關(guān)數(shù)據(jù)結(jié)構(gòu)算法的全部知識(shí)點(diǎn)。
    發(fā)表于 03-30 14:27 ?0次下載

    數(shù)據(jù)結(jié)構(gòu)算法分析

    部淺顯易懂的介紹數(shù)據(jù)結(jié)構(gòu)算法的書(shū)籍。
    發(fā)表于 07-14 17:12 ?0次下載

    算法數(shù)據(jù)結(jié)構(gòu)——接口

    第三章為算法數(shù)據(jù)結(jié)構(gòu),本文為3.2.3 接口。
    的頭像 發(fā)表于 09-19 17:41 ?8917次閱讀
    <b class='flag-5'>算法</b>與<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>——接口

    算法數(shù)據(jù)結(jié)構(gòu)——雙向鏈表

    第三章為算法數(shù)據(jù)結(jié)構(gòu),本文為3.3 雙向鏈表。
    的頭像 發(fā)表于 09-19 17:56 ?7557次閱讀
    <b class='flag-5'>算法</b>與<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>——雙向鏈表

    數(shù)據(jù)結(jié)構(gòu)是什么_數(shù)據(jù)結(jié)構(gòu)有什么用

    數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)存儲(chǔ)、組織數(shù)據(jù)的方式。數(shù)據(jù)結(jié)構(gòu)是指相互之間存在種或多種特定關(guān)系的數(shù)據(jù)元素的集合。通常情況下,精心選擇的
    發(fā)表于 11-17 14:45 ?1.6w次閱讀
    <b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>是什么_<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>有什么用

    大牛分享平時(shí)如何學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)算法

    數(shù)據(jù)結(jié)構(gòu)算法的地位對(duì)于個(gè)程序員來(lái)說(shuō)不言而喻。今天這篇文章不是來(lái)勸你們學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)算法的,也不是來(lái)和你們說(shuō)
    的頭像 發(fā)表于 11-02 11:25 ?3249次閱讀

    數(shù)據(jù)結(jié)構(gòu)算法分析—C語(yǔ)言描述

    數(shù)據(jù)結(jié)構(gòu)算法分析:C語(yǔ)言描述》曾被評(píng)為20世紀(jì)頂尖的30部計(jì)算機(jī)著作之,作者在數(shù)據(jù)結(jié)構(gòu)算法分析方面卓有建樹(shù),他的
    發(fā)表于 10-14 08:00 ?17次下載
    <b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>與<b class='flag-5'>算法</b>分析—C語(yǔ)言描述

    JavaScrit數(shù)據(jù)結(jié)構(gòu)算法(第2版)

    JavaScrit數(shù)據(jù)結(jié)構(gòu)算法(第2版)教材下載。
    發(fā)表于 06-01 15:35 ?0次下載

    算法數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)知識(shí)分享(上)

    有哪些常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)?基本操作是什么?常見(jiàn)的排序算法是如何實(shí)現(xiàn)的?各有什么優(yōu)缺點(diǎn)?本文簡(jiǎn)要分享算法基礎(chǔ)、常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)以及排序算法。
    的頭像 發(fā)表于 04-06 16:48 ?1032次閱讀
    <b class='flag-5'>算法</b>和<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>基礎(chǔ)知識(shí)分享(上)

    算法數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)知識(shí)分享(

    有哪些常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)?基本操作是什么?常見(jiàn)的排序算法是如何實(shí)現(xiàn)的?各有什么優(yōu)缺點(diǎn)?本文簡(jiǎn)要分享算法基礎(chǔ)、常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)以及排序算法。
    的頭像 發(fā)表于 04-06 16:48 ?830次閱讀
    <b class='flag-5'>算法</b>和<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>基礎(chǔ)知識(shí)分享(<b class='flag-5'>中</b>)

    算法數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)知識(shí)分享(下)

    有哪些常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)?基本操作是什么?常見(jiàn)的排序算法是如何實(shí)現(xiàn)的?各有什么優(yōu)缺點(diǎn)?本文簡(jiǎn)要分享算法基礎(chǔ)、常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)以及排序算法。
    的頭像 發(fā)表于 04-06 16:48 ?963次閱讀
    <b class='flag-5'>算法</b>和<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>基礎(chǔ)知識(shí)分享(下)