91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(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ě)的如此逼真,哈哈。

大廠(chǎng)面試的時(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

    文章

    4967

    瀏覽量

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

    關(guān)注

    0

    文章

    74

    瀏覽量

    12924

原文標(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)推薦
    熱點(diǎn)推薦

    新思科技2025年高光時(shí)刻回顧

    當(dāng)技術(shù)復(fù)雜度從“單點(diǎn)優(yōu)化”邁向“系統(tǒng)級(jí)協(xié)同”,創(chuàng)新的尺度也隨之被重新定義。過(guò)去一年,對(duì)新思科技來(lái)說(shuō),是一個(gè)載入史冊(cè)的年份。
    的頭像 發(fā)表于 02-24 17:42 ?1633次閱讀

    電能質(zhì)量在線(xiàn)監(jiān)測(cè)裝置支持密碼復(fù)雜度要求嗎?

    現(xiàn)代電能質(zhì)量在線(xiàn)監(jiān)測(cè)裝置(尤其是中高端型號(hào),適配電網(wǎng)安全要求)普遍支持密碼復(fù)雜度要求 ,且部分裝置會(huì)強(qiáng)制啟用該功能,核心目的是防范弱密碼導(dǎo)致的非法訪(fǎng)問(wèn)、數(shù)據(jù)篡改或設(shè)備操控風(fēng)險(xiǎn),符合電力行業(yè)信息安全
    的頭像 發(fā)表于 12-12 11:07 ?584次閱讀

    免停電接線(xiàn)的電能質(zhì)量在線(xiàn)監(jiān)測(cè)裝置的安裝和調(diào)試復(fù)雜嗎?

    免停電接線(xiàn)的電能質(zhì)量在線(xiàn)監(jiān)測(cè)裝置 整體安裝調(diào)試復(fù)雜度較低 ,遠(yuǎn)低于傳統(tǒng)停電接線(xiàn)模式,其中低壓系統(tǒng)可實(shí)現(xiàn) “快速部署、簡(jiǎn)易調(diào)試”,中高壓系統(tǒng)因需專(zhuān)業(yè)工具與資質(zhì),復(fù)雜度略有提升,但仍能通過(guò)標(biāo)準(zhǔn)化流程降低
    的頭像 發(fā)表于 12-05 18:00 ?3689次閱讀
    免停電接線(xiàn)的電能質(zhì)量在線(xiàn)監(jiān)測(cè)裝置的安裝和調(diào)試<b class='flag-5'>復(fù)雜</b>嗎?

    基于DSP與FPGA異構(gòu)架構(gòu)的高性能伺服控制系統(tǒng)設(shè)計(jì)

    DSP+FPGA架構(gòu)在伺服控制模塊中的應(yīng)用,成功解決了高性能伺服系統(tǒng)對(duì)實(shí)時(shí)性、精度和復(fù)雜度的多重需求。通過(guò)合理的功能劃分,DSP專(zhuān)注于復(fù)雜算法和上層控制,F(xiàn)PGA處理高速硬件任務(wù),兩者協(xié)同實(shí)現(xiàn)了傳統(tǒng)架構(gòu)難以達(dá)到的性能指標(biāo)。
    的頭像 發(fā)表于 12-04 15:38 ?569次閱讀
    基于DSP與FPGA異構(gòu)架構(gòu)的高性能伺服控制系統(tǒng)設(shè)計(jì)

    程序運(yùn)行慢,是否需檢查算法時(shí)間復(fù)雜度過(guò)高?

    程序運(yùn)行慢,需檢查算法時(shí)間復(fù)雜度是否過(guò)高?
    發(fā)表于 11-17 08:08

    程序運(yùn)行速度很慢如何優(yōu)化?

    ;gt;外設(shè),內(nèi)存<->內(nèi)存)交給DMA,釋放CPU資源。 優(yōu)化算法: 選擇時(shí)間復(fù)雜度更低的算法。避免不必要的循環(huán)和重復(fù)計(jì)算。 減少函數(shù)調(diào)用開(kāi)銷(xiāo): 對(duì)于頻繁調(diào)用的小函數(shù)
    發(fā)表于 11-17 06:12

    復(fù)雜的軟件算法硬件IP核的實(shí)現(xiàn)

    看到整個(gè)實(shí)現(xiàn)只有一個(gè)狀態(tài)“S0”。 對(duì)于有復(fù)雜時(shí)序要求的操作,例如加密算法里面常見(jiàn)的 for 循環(huán)結(jié)構(gòu),在生成 begin 和 end 之間就會(huì)有多個(gè)狀態(tài),每個(gè)狀態(tài)都對(duì)應(yīng)與某個(gè)組合邏輯的特定的連接方式
    發(fā)表于 10-30 07:02

    基于 SRT4 的整數(shù)除法器的優(yōu)化

    產(chǎn)生超大的面積,得不償失。為了縮短運(yùn)算周期,可以使用基數(shù)為4的數(shù)位遞歸SRT算法(每次迭代結(jié)果為2位),模擬基64的SRT算法,每個(gè)循環(huán)重復(fù)多次,每個(gè)周期進(jìn)行3次迭代,即6位/周期,等效于基數(shù)為64
    發(fā)表于 10-23 07:23

    Booth編碼的原理及選擇

    }的部分積,數(shù)目減少了一半。P中僅有5個(gè)元素,大大減輕了多路選擇的負(fù)擔(dān),且2M可以通過(guò)1位左移操作產(chǎn)生,很好的實(shí)現(xiàn)了部分積個(gè)數(shù)與Р中元素的生成和選擇之間的平衡。因此結(jié)構(gòu)相對(duì)比較簡(jiǎn)單,硬件復(fù)雜度不大,是目前最廣泛使用的部分積生成算法。
    發(fā)表于 10-22 07:53

    e203除法器算法改進(jìn)(二)

    表示余數(shù)) 利用數(shù)學(xué)遞歸算法進(jìn)行將除法操作簡(jiǎn)化為迭代算法,每次迭代產(chǎn)生一個(gè)基數(shù)為$beta$的商。經(jīng)過(guò)$j$次迭代后,產(chǎn)生的商值表示為: q{j}=sum{i=0}^j q_i beta^{j-i
    發(fā)表于 10-22 06:11

    NTT設(shè)計(jì)介紹

    去乘以另一個(gè)數(shù)據(jù)的每一位,其算法時(shí)間復(fù)雜度為。NTT可以看作是定義在有限域上的快速傅里葉變換,算法時(shí)間復(fù)
    發(fā)表于 10-22 06:05

    電能質(zhì)量在線(xiàn)監(jiān)測(cè)裝置的精度等級(jí)和準(zhǔn)確的關(guān)系是否受測(cè)量參數(shù)的影響?

    電能質(zhì)量在線(xiàn)監(jiān)測(cè)裝置的精度等級(jí)和準(zhǔn)確的關(guān)系 會(huì)顯著受測(cè)量參數(shù)影響 ,核心原因在于:不同電能質(zhì)量參數(shù)(如電壓有效值、諧波、閃變、暫升 / 暫降)的 測(cè)量原理復(fù)雜度、硬件依賴(lài)算法要求
    的頭像 發(fā)表于 09-12 10:02 ?658次閱讀
    電能質(zhì)量在線(xiàn)監(jiān)測(cè)裝置的精度等級(jí)和準(zhǔn)確<b class='flag-5'>度</b>的關(guān)系是否受測(cè)量參數(shù)的影響?

    時(shí)間同步設(shè)備在復(fù)雜網(wǎng)絡(luò)環(huán)境中的調(diào)試要點(diǎn)

    時(shí)間同步設(shè)備是保障網(wǎng)絡(luò)系統(tǒng)協(xié)同運(yùn)行的基礎(chǔ)設(shè)施,尤其在金融、電力、通信等領(lǐng)域?qū)纫筝^高的場(chǎng)景中,其穩(wěn)定性直接影響業(yè)務(wù)連續(xù)性。在實(shí)際部署中,網(wǎng)絡(luò)環(huán)境的復(fù)雜性常給同步精度帶來(lái)挑戰(zhàn)。本文將分享幾個(gè)調(diào)試過(guò)程中的經(jīng)驗(yàn)要點(diǎn)。
    的頭像 發(fā)表于 08-13 15:48 ?495次閱讀
    <b class='flag-5'>時(shí)間</b>同步設(shè)備在<b class='flag-5'>復(fù)雜</b>網(wǎng)絡(luò)環(huán)境中的調(diào)試要點(diǎn)

    LABVIEW遞歸獲取列表顯示到樹(shù)形結(jié)構(gòu)

    我這個(gè)遞歸我邏輯沒(méi)問(wèn)題啊!我斷點(diǎn)調(diào)試看了,是因?yàn)橹厝隫I執(zhí)行沒(méi)有把樹(shù)形結(jié)構(gòu)里面節(jié)點(diǎn)傳入到下一個(gè)遞歸調(diào)用,進(jìn)入重調(diào)用的時(shí)候我看了樹(shù)形結(jié)構(gòu)里面節(jié)點(diǎn)是空的。第一次寫(xiě)入的節(jié)點(diǎn)并沒(méi)有傳入到下一次遞歸。 反正很
    發(fā)表于 08-07 17:59

    ADIN2111集成10BASE-T1L PHY的低復(fù)雜度、2端口以太網(wǎng)交換機(jī)技術(shù)手冊(cè)

    ADIN2111是一款低功耗、低復(fù)雜度、雙以太網(wǎng)端口交換機(jī),它集成了10BASE-T1L PHY和一個(gè)串行外設(shè)接口(SPI)端口。該器件使用低功率受限節(jié)點(diǎn),面向工業(yè)以太網(wǎng)應(yīng)用且符合IEEE
    的頭像 發(fā)表于 05-15 11:41 ?1864次閱讀
    ADIN2111集成10BASE-T1L PHY的低<b class='flag-5'>復(fù)雜度</b>、2端口以太網(wǎng)交換機(jī)技術(shù)手冊(cè)