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

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

好好分析一下如何求遞歸算法的時間復雜度

算法與數據結構 ? 來源:代碼隨想錄 ? 作者:程序員Carl ? 2022-07-13 11:29 ? 次閱讀

相信很多同學對遞歸算法的時間復雜度都很模糊,那么這篇來給大家通透的講一講。

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

這是為什么呢?

如果對遞歸的時間復雜度理解的不夠深入的話,就會這樣!

那么我通過一道簡單的面試題,模擬面試的場景,來帶大家逐步分析遞歸算法的時間復雜度,最后找出最優解,來看看同樣是遞歸,怎么就寫成了O(n)的代碼。

面試題:求x的n次方

想一下這么簡單的一道題目,代碼應該如何寫呢。最直觀的方式應該就是,一個for循環求出結果,代碼如下:

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

時間復雜度為O(n),此時面試官會說,有沒有效率更好的算法呢。

如果此時沒有思路,不要說:我不會,我不知道了等等

可以和面試官探討一下,詢問:“可不可以給點提示”。面試官提示:“考慮一下遞歸算法”。

那么就可以寫出了如下這樣的一個遞歸的算法,使用遞歸解決了這個問題。

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

面試官問:“那么這個代碼的時間復雜度是多少?”。

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

那再來看代碼,這里遞歸了幾次呢?

每次n-1,遞歸了n次時間復雜度是O(n),每次進行了一個乘法操作,乘法操作的時間復雜度一個常數項O(1),所以這份代碼的時間復雜度是 n * 1 = 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);
}

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

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

pYYBAGLOPHOADNe1AAEQVirlC3Q595.jpg

當前這顆二叉樹就是求x的n次方,n為16的情況,n為16的時候,進行了多少次乘法運算呢?

這棵樹上每一個節點就代表著一次遞歸并進行了一次相乘操作,所以進行了多少次遞歸的話,就是看這棵樹上有多少個節點。

熟悉二叉樹話應該知道如何求滿二叉樹節點數量,這顆滿二叉樹的節點數量就是2^3 + 2^2 + 2^1 + 2^0 = 15,可以發現:這其實是等比數列的求和公式,這個結論在二叉樹相關的面試題里也經常出現

這么如果是求x的n次方,這個遞歸樹有多少個節點呢,如下圖所示:(m為深度,從0開始)

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

時間復雜度忽略掉常數項-1之后,這個遞歸算法的時間復雜度依然是O(n)。對,你沒看錯,依然是O(n)的時間復雜度!

此時面試官就會說:“這個遞歸的算法依然還是O(n)啊”, 很明顯沒有達到面試官的預期。

那么O(logn)的遞歸算法應該怎么寫呢?

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

于是又寫出如下遞歸算法的代碼:

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

再來看一下現在這份代碼時間復雜度是多少呢?

依然還是看他遞歸了多少次,可以看到這里僅僅有一個遞歸調用,且每次都是n/2 ,所以這里我們一共調用了log以2為底n的對數次。

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

此時大家最后寫出了這樣的代碼并且將時間復雜度分析的非常清晰,相信面試官是比較滿意的。

總結

對于遞歸的時間復雜度,畢竟初學者有時候會迷糊,刷過很多題的老手依然迷糊。

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

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

對于function3 這樣的遞歸實現,很容易讓人感覺這是O(logn)的時間復雜度,其實這是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);
}

可以看出這道題目非常簡單,但是又很考究算法的功底,特別是對遞歸的理解,這也是我面試別人的時候用過的一道題,所以整個情景我才寫的如此逼真,哈哈。

大廠面試的時候最喜歡用“簡單題”來考察候選人的算法功底,注意這里的“簡單題”可并不一定真的簡單哦!

如果認真讀完本篇,相信大家對遞歸算法的有一個新的認識的,同一道題目,同樣是遞歸,效率可是不一樣的!



審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 算法
    +關注

    關注

    23

    文章

    4625

    瀏覽量

    93143
收藏 人收藏

    評論

    相關推薦

    “碰一下”支付背后的4G技術

    不知道你是否有留意,近期,在線下支付場景中,多了個支付寶“碰一下”支付的設備,只需要“解鎖手機—碰一下—確認”即可完成支付,對比打開付款碼支付,步驟確實更加簡潔。
    的頭像 發表于 01-03 16:27 ?424次閱讀

    AI時代芯片復雜度飆升,思爾芯國產硬件仿真加速芯片創新

    引言在人工智能(AI)技術蓬勃發展的今天,芯片的復雜度正以前所未有的速度飆升,輕松跨越了百億邏輯門級別的大關。這趨勢不僅推動了半導體行業的快速發展,也對硬件仿真系統提出了更高的挑戰和要求。在近日
    的頭像 發表于 12-27 18:01 ?400次閱讀
    AI時代<b class='flag-5'>下</b>芯片<b class='flag-5'>復雜度</b>飆升,思爾芯國產硬件仿真加速芯片創新

    NPU與機器學習算法的關系

    在人工智能領域,機器學習算法是實現智能系統的核心。隨著數據量的激增和算法復雜度的提升,對計算資源的需求也在不斷增長。NPU作為種專門為深度學習等機器學習任務設計的處理器,其與機器學習
    的頭像 發表于 11-15 09:19 ?547次閱讀

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

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

    淺談Vivado編譯時間

    隨著FPGA規模的增大,設計復雜度的增加,Vivado編譯時間成為個不可回避的話題。尤其是些基于SSI芯片的設計,如VU9P/VU13P/VU19P等,布局布線
    的頭像 發表于 09-18 10:43 ?1114次閱讀
    淺談Vivado編譯<b class='flag-5'>時間</b>

    PCB與PCBA工藝復雜度的量化評估與應對措施

    站式PCBA智造廠家今天為大家講講PCBA工藝復雜嗎?PCBA工藝的復雜性應對PCBA工藝復雜性的措施。在電子制造領域,PCBA工藝是至關重要的環節。盡管對許多人來說,PCBA工藝可
    的頭像 發表于 09-13 09:21 ?451次閱讀

    業務復雜度治理方法論--十年系統設計經驗總結

    復雜度量公式 ? ? ? ? ? 子模塊的復雜度cp乘以該模塊對應的開發時間權重值tp,累加后得到系統的整體復雜度C 這里的子模塊復雜度 c
    的頭像 發表于 09-05 14:11 ?1037次閱讀
    業務<b class='flag-5'>復雜度</b>治理方法論--十年系統設計經驗總結

    Python遞歸的經典案例

    當我們碰到諸如需要求階乘或斐波那契數列的問題時,使用普通的循環往往比較麻煩,但如果我們使用遞歸時,會簡單許多,起到事半功倍的效果。這篇文章主要和大家分享些和遞歸有關的經典案例,結合
    的頭像 發表于 08-05 15:57 ?363次閱讀

    CISC(復雜指令集)與RISC(精簡指令集)的區別  

    RISC指令之間可以被打斷,所以理 論上RISC可更快響應中斷。 在此,總結一下CISC和RISC的主要區別: CISC的指令能力強,但多數指令使用率低卻增加了CPU的復雜度,指令是可變長格式;RISC
    發表于 07-30 17:21

    遞歸神經網絡的實現方法

    遞歸神經網絡(Recursive Neural Network,簡稱RNN)是種特殊類型的神經網絡,其特點在于能夠處理具有層次或樹狀結構的數據,并通過遞歸的方式對這些數據進行建模。與循環神經網絡
    的頭像 發表于 07-10 17:02 ?361次閱讀

    遞歸神經網絡結構形式主要分為

    遞歸神經網絡(Recurrent Neural Networks,簡稱RNN)是種具有時間序列處理能力的神經網絡,其結構形式多樣,可以根據不同的需求進行選擇和設計。本文將介紹遞歸神經
    的頭像 發表于 07-05 09:32 ?592次閱讀

    遞歸神經網絡與循環神經網絡樣嗎

    神經網絡是種基于樹結構的神經網絡模型,它通過遞歸地將輸入數據分解為更小的子問題來處理序列數據。RvNN的核心思想是將復雜的序列問題
    的頭像 發表于 07-05 09:28 ?957次閱讀

    遞歸神經網絡是循環神經網絡嗎

    遞歸神經網絡的概念 遞歸神經網絡是種具有短期記憶功能的神經網絡,它能夠處理序列數據,如時間序列、文本、語音等。與傳統的前饋神經網絡不同,遞歸
    的頭像 發表于 07-04 14:54 ?841次閱讀

    遞歸神經網絡的結構、特點、優缺點及適用場景

    識別、時間序列分析等領域有著廣泛的應用。本文將詳細介紹遞歸神經網絡的結構、特點、優缺點以及適用場景。 遞歸神經網絡的結構 基本結構
    的頭像 發表于 07-04 14:52 ?1602次閱讀

    PCB與PCBA工藝復雜度的量化評估與應用初探!

    , 不知道如何區分普通和復雜的PCB和 PCBA的設計,并采用什么樣的方式來處理。 基于上述考慮, 我們參考了業 界已有的作法, 設計了個PCB 和 PCBA的工藝復雜度計算公式以解決這 方面
    發表于 06-14 11:15
    主站蜘蛛池模板: 国产成人啪精品午夜在线播放 | 伊人久久大香线蕉综合影| 4438x色| 在线免费看黄视频| 男人j进女人j免费视频视频| 99热99热| 天堂电影免费在线资源| 日本黄色免费看| 经典三级影院| 成年大片免费视频播放手机不卡| 夜夜澡人人爽人人喊_欧美| 天天操夜夜操| haodiaose在线精品免费观看| 全国最大色成免费网站| 欧美一级视频在线| 精品国产影院| 91黄色影院| 丁香狠狠| 天天摸天天做天天爽在线| 毛片天天看| 57pao强力打造免费高清高速| 久久国产精品免费看| 羞涩妩媚玉腿呻吟嗯啊销魂迎合| 日本久本草精品| 国内精品免费视频精选在线观看| 免费精品一区二区三区在线观看| 色老头在线视频| 毛片官网| 正在播放国产女免费| 九九99久久精品影视| 天天干夜夜夜| 777精品视频| 国产精品丝袜在线观看| 色多多在线观看| 国产日韩精品一区二区在线观看 | 天堂网www中文在线资源| 欧美精品videofree720p| 国产精品久久久久久久久| 视频免费观看网址| japanese69xxx日本| 五月综合色|