在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

如何求遞歸算法的時(shí)間復(fù)雜度

算法與數(shù)據(jù)結(jié)構(gòu) ? 來(lái)源:代碼隨想錄 ? 作者:代碼隨想錄 ? 2022-07-13 11:33 ? 次閱讀

本篇通過(guò)一道面試題,一個(gè)面試場(chǎng)景,來(lái)好好分析一下如何求遞歸算法的時(shí)間復(fù)雜度。

相信很多同學(xué)對(duì)遞歸算法的時(shí)間復(fù)雜度都很模糊,那么這篇Carl來(lái)給大家通透的講一講。

同一道題目,同樣使用遞歸算法,有的同學(xué)會(huì)寫(xiě)出了O(n)的代碼,有的同學(xué)就寫(xiě)出了O(logn)的代碼

這是為什么呢?

如果對(duì)遞歸的時(shí)間復(fù)雜度理解的不夠深入的話(huà),就會(huì)這樣!

那么我通過(guò)一道簡(jiǎn)單的面試題,模擬面試的場(chǎng)景,來(lái)帶大家逐步分析遞歸算法的時(shí)間復(fù)雜度,最后找出最優(yōu)解,來(lái)看看同樣是遞歸,怎么就寫(xiě)成了O(n)的代碼。

面試題:求x的n次方

想一下這么簡(jiǎn)單的一道題目,代碼應(yīng)該如何寫(xiě)呢。最直觀的方式應(yīng)該就是,一個(gè)for循環(huán)求出結(jié)果,代碼如下:

intfunction1(intx,intn){
intresult=1;//注意任何數(shù)的0次方等于1
for(inti=0;i

時(shí)間復(fù)雜度為O(n),此時(shí)面試官會(huì)說(shuō),有沒(méi)有效率更好的算法呢。

如果此時(shí)沒(méi)有思路,不要說(shuō):我不會(huì),我不知道了等等

可以和面試官探討一下,詢(xún)問(wèn):“可不可以給點(diǎn)提示”。面試官提示:“考慮一下遞歸算法”。

那么就可以寫(xiě)出了如下這樣的一個(gè)遞歸的算法,使用遞歸解決了這個(gè)問(wèn)題。

intfunction2(intx,intn){
if(n==0){
return1;//return1同樣是因?yàn)?次方是等于1的
}
returnfunction2(x,n-1)*x;
}

面試官問(wèn):“那么這個(gè)代碼的時(shí)間復(fù)雜度是多少?”。

一些同學(xué)可能一看到遞歸就想到了O(logn),其實(shí)并不是這樣,遞歸算法的時(shí)間復(fù)雜度本質(zhì)上是要看:遞歸的次數(shù) * 每次遞歸中的操作次數(shù)

那再來(lái)看代碼,這里遞歸了幾次呢?

每次n-1,遞歸了n次時(shí)間復(fù)雜度是O(n),每次進(jìn)行了一個(gè)乘法操作,乘法操作的時(shí)間復(fù)雜度一個(gè)常數(shù)項(xiàng)O(1),所以這份代碼的時(shí)間復(fù)雜度是 n * 1 = O(n)。

這個(gè)時(shí)間復(fù)雜度就沒(méi)有達(dá)到面試官的預(yù)期。于是又寫(xiě)出了如下的遞歸算法的代碼:

intfunction3(intx,intn){
if(n==0){
return1;
}
if(n%2==1){
returnfunction3(x,n/2)*function3(x,n/2)*x;
}
returnfunction3(x,n/2)*function3(x,n/2);
}

面試官看到后微微一笑,問(wèn):“這份代碼的時(shí)間復(fù)雜度又是多少呢?” 此刻有些同學(xué)可能要陷入了沉思了。

我們來(lái)分析一下,首先看遞歸了多少次呢,可以把遞歸抽象出一顆滿(mǎn)二叉樹(shù)。剛剛同學(xué)寫(xiě)的這個(gè)算法,可以用一顆滿(mǎn)二叉樹(shù)來(lái)表示(為了方便表示,選擇n為偶數(shù)16),如圖:

fc74a264-025a-11ed-ba43-dac502259ad0.png

當(dāng)前這顆二叉樹(shù)就是求x的n次方,n為16的情況,n為16的時(shí)候,進(jìn)行了多少次乘法運(yùn)算呢?

這棵樹(shù)上每一個(gè)節(jié)點(diǎn)就代表著一次遞歸并進(jìn)行了一次相乘操作,所以進(jìn)行了多少次遞歸的話(huà),就是看這棵樹(shù)上有多少個(gè)節(jié)點(diǎn)。

熟悉二叉樹(shù)話(huà)應(yīng)該知道如何求滿(mǎn)二叉樹(shù)節(jié)點(diǎn)數(shù)量,這顆滿(mǎn)二叉樹(shù)的節(jié)點(diǎn)數(shù)量就是2^3 + 2^2 + 2^1 + 2^0 = 15,可以發(fā)現(xiàn):這其實(shí)是等比數(shù)列的求和公式,這個(gè)結(jié)論在二叉樹(shù)相關(guān)的面試題里也經(jīng)常出現(xiàn)

這么如果是求x的n次方,這個(gè)遞歸樹(shù)有多少個(gè)節(jié)點(diǎn)呢,如下圖所示:(m為深度,從0開(kāi)始)

fc93b21c-025a-11ed-ba43-dac502259ad0.png

時(shí)間復(fù)雜度忽略掉常數(shù)項(xiàng)-1之后,這個(gè)遞歸算法的時(shí)間復(fù)雜度依然是O(n)。對(duì),你沒(méi)看錯(cuò),依然是O(n)的時(shí)間復(fù)雜度!

此時(shí)面試官就會(huì)說(shuō):“這個(gè)遞歸的算法依然還是O(n)啊”, 很明顯沒(méi)有達(dá)到面試官的預(yù)期。

那么O(logn)的遞歸算法應(yīng)該怎么寫(xiě)呢?

想一想剛剛給出的那份遞歸算法的代碼,是不是有哪里比較冗余呢,其實(shí)有重復(fù)計(jì)算的部分。

于是又寫(xiě)出如下遞歸算法的代碼:

intfunction4(intx,intn){
if(n==0){
return1;
}
intt=function4(x,n/2);//這里相對(duì)于function3,是把這個(gè)遞歸操作抽取出來(lái)
if(n%2==1){
returnt*t*x;
}
returnt*t;
}

再來(lái)看一下現(xiàn)在這份代碼時(shí)間復(fù)雜度是多少呢?

依然還是看他遞歸了多少次,可以看到這里僅僅有一個(gè)遞歸調(diào)用,且每次都是n/2 ,所以這里我們一共調(diào)用了log以2為底n的對(duì)數(shù)次。

每次遞歸了做都是一次乘法操作,這也是一個(gè)常數(shù)項(xiàng)的操作,那么這個(gè)遞歸算法的時(shí)間復(fù)雜度才是真正的O(logn)

此時(shí)大家最后寫(xiě)出了這樣的代碼并且將時(shí)間復(fù)雜度分析的非常清晰,相信面試官是比較滿(mǎn)意的。

總結(jié)

對(duì)于遞歸的時(shí)間復(fù)雜度,畢竟初學(xué)者有時(shí)候會(huì)迷糊,刷過(guò)很多題的老手依然迷糊。

本篇我用一道非常簡(jiǎn)單的面試題目:求x的n次方,來(lái)逐步分析遞歸算法的時(shí)間復(fù)雜度,注意不要一看到遞歸就想到了O(logn)!

同樣使用遞歸,有的同學(xué)可以寫(xiě)出O(logn)的代碼,有的同學(xué)還可以寫(xiě)出O(n)的代碼。

對(duì)于function3 這樣的遞歸實(shí)現(xiàn),很容易讓人感覺(jué)這是O(logn)的時(shí)間復(fù)雜度,其實(shí)這是O(n)的算法!

intfunction3(intx,intn){
if(n==0){
return1;
}
if(n%2==1){
returnfunction3(x,n/2)*function3(x,n/2)*x;
}
returnfunction3(x,n/2)*function3(x,n/2);
}

可以看出這道題目非常簡(jiǎn)單,但是又很考究算法的功底,特別是對(duì)遞歸的理解,這也是我面試別人的時(shí)候用過(guò)的一道題,所以整個(gè)情景我才寫(xiě)的如此逼真,哈哈。

大廠面試的時(shí)候最喜歡用“簡(jiǎn)單題”來(lái)考察候選人的算法功底,注意這里的“簡(jiǎn)單題”可并不一定真的簡(jiǎn)單哦!

如果認(rèn)真讀完本篇,相信大家對(duì)遞歸算法的有一個(gè)新的認(rèn)識(shí)的,同一道題目,同樣是遞歸,效率可是不一樣的!

原文標(biāo)題:關(guān)于遞歸算法的時(shí)間復(fù)雜度,你還不夠了解

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

審核編輯:彭靜

聲明:本文內(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)注

    30

    文章

    4837

    瀏覽量

    69123
  • 二叉樹(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    74

    瀏覽量

    12390

原文標(biāo)題:關(guān)于遞歸算法的時(shí)間復(fù)雜度,你還不夠了解

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    AI時(shí)代下芯片復(fù)雜度飆升,思爾芯國(guó)產(chǎn)硬件仿真加速芯片創(chuàng)新

    引言在人工智能(AI)技術(shù)蓬勃發(fā)展的今天,芯片的復(fù)雜度正以前所未有的速度飆升,輕松跨越了百億邏輯門(mén)級(jí)別的大關(guān)。這一趨勢(shì)不僅推動(dòng)了半導(dǎo)體行業(yè)的快速發(fā)展,也對(duì)硬件仿真系統(tǒng)提出了更高的挑戰(zhàn)和要求。在近日
    的頭像 發(fā)表于 12-27 18:01 ?458次閱讀
    AI時(shí)代下芯片<b class='flag-5'>復(fù)雜度</b>飆升,思爾芯國(guó)產(chǎn)硬件仿真加速芯片創(chuàng)新

    芯片設(shè)計(jì)復(fù)雜度劇增,紫光芯片云 3.0 助力企業(yè)搭建專(zhuān)業(yè)設(shè)計(jì)環(huán)境

    。 ? 實(shí)際上,國(guó)內(nèi)中小IC設(shè)計(jì)企業(yè)居多,而如今他們面臨更加復(fù)雜的設(shè)計(jì)需求。隨著芯片制程和規(guī)模要求不斷提高,芯片設(shè)計(jì)環(huán)境所需資源越來(lái)越大,設(shè)計(jì)環(huán)境構(gòu)建更加復(fù)雜,初創(chuàng)企業(yè)如何搭建設(shè)計(jì)環(huán)境,中小企業(yè)如何在人員經(jīng)驗(yàn)欠缺的情況下完成有效布局,又如
    的頭像 發(fā)表于 12-26 17:04 ?950次閱讀
    芯片設(shè)計(jì)<b class='flag-5'>復(fù)雜度</b>劇增,紫光芯片云 3.0 助力企業(yè)搭建專(zhuān)業(yè)設(shè)計(jì)環(huán)境

    NPU與機(jī)器學(xué)習(xí)算法的關(guān)系

    在人工智能領(lǐng)域,機(jī)器學(xué)習(xí)算法是實(shí)現(xiàn)智能系統(tǒng)的核心。隨著數(shù)據(jù)量的激增和算法復(fù)雜度的提升,對(duì)計(jì)算資源的需求也在不斷增長(zhǎng)。NPU作為一種專(zhuān)門(mén)為深度學(xué)習(xí)等機(jī)器學(xué)習(xí)任務(wù)設(shè)計(jì)的處理器,其與機(jī)器學(xué)習(xí)算法
    的頭像 發(fā)表于 11-15 09:19 ?632次閱讀

    時(shí)間復(fù)雜度為 O(n^2) 的排序算法

    作者:京東保險(xiǎn) 王奕龍 對(duì)于小規(guī)模數(shù)據(jù),我們可以選用時(shí)間復(fù)雜度為 O(n2) 的排序算法。因?yàn)?b class='flag-5'>時(shí)間復(fù)雜度并不代表實(shí)際代碼的執(zhí)行
    的頭像 發(fā)表于 10-19 16:31 ?1260次閱讀
    <b class='flag-5'>時(shí)間</b><b class='flag-5'>復(fù)雜度</b>為 O(n^2) 的排序<b class='flag-5'>算法</b>

    淺談Vivado編譯時(shí)間

    隨著FPGA規(guī)模的增大,設(shè)計(jì)復(fù)雜度的增加,Vivado編譯時(shí)間成為一個(gè)不可回避的話(huà)題。尤其是一些基于SSI芯片的設(shè)計(jì),如VU9P/VU13P/VU19P等,布局布線時(shí)間更是顯著增加。當(dāng)然,對(duì)于一些設(shè)計(jì)而言,十幾個(gè)小時(shí)是合理的。但
    的頭像 發(fā)表于 09-18 10:43 ?1217次閱讀
    淺談Vivado編譯<b class='flag-5'>時(shí)間</b>

    PCB與PCBA工藝復(fù)雜度的量化評(píng)估與應(yīng)對(duì)措施

    一站式PCBA智造廠家今天為大家講講PCBA工藝復(fù)雜嗎?PCBA工藝的復(fù)雜性應(yīng)對(duì)PCBA工藝復(fù)雜性的措施。在電子制造領(lǐng)域,PCBA工藝是至關(guān)重要的環(huán)節(jié)。盡管對(duì)許多人來(lái)說(shuō),PCBA工藝可能看似復(fù)
    的頭像 發(fā)表于 09-13 09:21 ?490次閱讀

    業(yè)務(wù)復(fù)雜度治理方法論--十年系統(tǒng)設(shè)計(jì)經(jīng)驗(yàn)總結(jié)

    復(fù)雜度量公式 ? ? ? ? ? 子模塊的復(fù)雜度cp乘以該模塊對(duì)應(yīng)的開(kāi)發(fā)時(shí)間權(quán)重值tp,累加后得到系統(tǒng)的整體復(fù)雜度C 這里的子模塊復(fù)雜度 c
    的頭像 發(fā)表于 09-05 14:11 ?1067次閱讀
    業(yè)務(wù)<b class='flag-5'>復(fù)雜度</b>治理方法論--十年系統(tǒng)設(shè)計(jì)經(jīng)驗(yàn)總結(jié)

    Python遞歸的經(jīng)典案例

    當(dāng)我們碰到諸如需要求階乘或斐波那契數(shù)列的問(wèn)題時(shí),使用普通的循環(huán)往往比較麻煩,但如果我們使用遞歸時(shí),會(huì)簡(jiǎn)單許多,起到事半功倍的效果。這篇文章主要和大家分享一些和遞歸有關(guān)的經(jīng)典案例,結(jié)合一些資料談一下個(gè)人的理解,也借此加深自己對(duì)遞歸
    的頭像 發(fā)表于 08-05 15:57 ?400次閱讀

    遞歸神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)方法

    遞歸神經(jīng)網(wǎng)絡(luò)(Recursive Neural Network,簡(jiǎn)稱(chēng)RNN)是一種特殊類(lèi)型的神經(jīng)網(wǎng)絡(luò),其特點(diǎn)在于能夠處理具有層次或樹(shù)狀結(jié)構(gòu)的數(shù)據(jù),并通過(guò)遞歸的方式對(duì)這些數(shù)據(jù)進(jìn)行建模。與循環(huán)神經(jīng)網(wǎng)絡(luò)
    的頭像 發(fā)表于 07-10 17:02 ?412次閱讀

    遞歸神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)形式主要分為

    遞歸神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Networks,簡(jiǎn)稱(chēng)RNN)是一種具有時(shí)間序列處理能力的神經(jīng)網(wǎng)絡(luò),其結(jié)構(gòu)形式多樣,可以根據(jù)不同的需求進(jìn)行選擇和設(shè)計(jì)。本文將介紹遞歸神經(jīng)網(wǎng)絡(luò)的幾種主要
    的頭像 發(fā)表于 07-05 09:32 ?623次閱讀

    遞歸神經(jīng)網(wǎng)絡(luò)與循環(huán)神經(jīng)網(wǎng)絡(luò)一樣嗎

    神經(jīng)網(wǎng)絡(luò)是一種基于樹(shù)結(jié)構(gòu)的神經(jīng)網(wǎng)絡(luò)模型,它通過(guò)遞歸地將輸入數(shù)據(jù)分解為更小的子問(wèn)題來(lái)處理序列數(shù)據(jù)。RvNN的核心思想是將復(fù)雜的序列問(wèn)題
    的頭像 發(fā)表于 07-05 09:28 ?1011次閱讀

    遞歸神經(jīng)網(wǎng)絡(luò)是循環(huán)神經(jīng)網(wǎng)絡(luò)嗎

    遞歸神經(jīng)網(wǎng)絡(luò)的概念 遞歸神經(jīng)網(wǎng)絡(luò)是一種具有短期記憶功能的神經(jīng)網(wǎng)絡(luò),它能夠處理序列數(shù)據(jù),如時(shí)間序列、文本、語(yǔ)音等。與傳統(tǒng)的前饋神經(jīng)網(wǎng)絡(luò)不同,遞歸神經(jīng)網(wǎng)絡(luò)的神經(jīng)元之間存在循環(huán)連接,使得
    的頭像 發(fā)表于 07-04 14:54 ?897次閱讀

    遞歸神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)、特點(diǎn)、優(yōu)缺點(diǎn)及適用場(chǎng)景

    識(shí)別、時(shí)間序列分析等領(lǐng)域有著廣泛的應(yīng)用。本文將詳細(xì)介紹遞歸神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)、特點(diǎn)、優(yōu)缺點(diǎn)以及適用場(chǎng)景。 一、遞歸神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu) 基本結(jié)構(gòu) 遞歸神經(jīng)網(wǎng)絡(luò)的基本結(jié)構(gòu)包括輸入層、隱藏層和輸出層
    的頭像 發(fā)表于 07-04 14:52 ?1710次閱讀

    PCB與PCBA工藝復(fù)雜度的量化評(píng)估與應(yīng)用初探!

    , 不知道如何區(qū)分普通和復(fù)雜的PCB和 PCBA的設(shè)計(jì),并采用什么樣的方式來(lái)處理。 基于上述考慮, 我們參考了業(yè) 界已有的作法, 設(shè)計(jì)了一個(gè)PCB 和 PCBA的工藝復(fù)雜度計(jì)算公式以解決這 方面
    發(fā)表于 06-14 11:15

    關(guān)于C語(yǔ)言中的遞歸

    遞歸指的是在函數(shù)的定義中使用函數(shù)自身的方法。
    發(fā)表于 02-26 10:34 ?439次閱讀
    關(guān)于C語(yǔ)言中的<b class='flag-5'>遞歸</b>
    主站蜘蛛池模板: 免费网站成人亚洲 | 色老成人精品视频在线观看 | 亚洲欧美国产五月天综合 | 午夜亚洲国产 | 亚洲欧美国产视频 | 日本免费一区二区老鸭窝 | 张柏芝三级无删减在线观看 | 一级毛片aa | 在线观看一级片 | 轻点灬大ji巴太大太深了 | 男人操女人视频在线观看 | 岛国午夜精品视频在线观看 | 成人国内精品久久久久影院 | 午夜视频在线观看www中文 | 亚洲欧美日本视频 | 天堂网最新版www | 狠狠色婷婷丁香综合久久韩国 | 神马电影天堂网 | 天天爽夜夜爽视频 | 亚洲精品亚洲人成人网 | 国产亚洲精品久久久久久久软件 | 国模网站| 在线播放免费人成毛片乱码 | 欧美黑人巨大xxx猛交 | 天堂免费在线视频 | 色四虎 | 日本特黄特色大片免费看 | 高清一区二区 | 99久久99久久免费精品蜜桃 | 天天拍夜夜添久久精品免费 | 久久综合成人网 | 亚洲视频一区在线 | 欧美一区二区视频 | 狠狠干狠狠艹 | 老师下面好紧 | 免费精品美女久久久久久久久久 | 欧亚精品卡一卡二卡三 | 亚洲一区二区三区中文字幕5566 | 国产做爰一区二区 | 四虎影院网站 | 97色爱|