那曲檬骨新材料有限公司

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

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

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

算法之空間復(fù)雜度

C語言編程學(xué)習(xí)基地 ? 來源:51CTO ? 作者:慕雪年華 ? 2022-08-31 10:29 ? 次閱讀

算法之空間復(fù)雜度:衡量一個(gè)算法運(yùn)行需要開辟的額外空間

上次我們學(xué)習(xí)了時(shí)間復(fù)雜度,那么我們今天就來看看空間復(fù)雜度!

d790ab62-2840-11ed-ba43-dac502259ad0.png

概念

空間復(fù)雜度是對(duì)一個(gè)算法在運(yùn)行過程中臨時(shí)占用空間大小的度量

和時(shí)間復(fù)雜度不是真的計(jì)算時(shí)間一樣,空間復(fù)雜度也不衡量算法具體占用的內(nèi)存字節(jié)數(shù)。

空間復(fù)雜度計(jì)算的是額外開辟的變量的個(gè)數(shù),適用大O漸近法

注意:函數(shù)運(yùn)行時(shí)所需要的棧空間(存儲(chǔ)參數(shù)、局部變量、一些寄存器信息等)在編譯期間已經(jīng)確定好了,因此空間復(fù)雜度主要通過函數(shù)在運(yùn)行時(shí)候顯式申請(qǐng)的額外空間來確定。

空間復(fù)雜度計(jì)算

NO.1 冒泡排序

voidBubbleSort(int*a,intn){     assert(a);     for (size_t end = n; end > 0; --end)     {         int exchange = 0;         for (size_t i = 1; i < end; ++i)         {          if (a[i-1] > a[i])          {                Swap(&a[i-1], &a[i]);                exchange = 1;          }       }     if (exchange == 0)       break;     }}

我們會(huì)發(fā)現(xiàn),冒泡排序算法并沒有額外定義非常多的變量,一共只有3個(gè),屬于常數(shù)階

size_t end = n;int exchange = 0;size_t i = 1;

其空間復(fù)雜度為O(1)

計(jì)算時(shí)注意其與N的關(guān)系

當(dāng)我們?cè)谒惴ㄖ虚_辟空間,計(jì)算空間復(fù)雜度的時(shí)候,要注意開辟的這個(gè)空間與N有沒有關(guān)系

int arr[N];//c99變長(zhǎng)數(shù)組,和傳過來的參數(shù)有關(guān)int*a=(int*)malloc(sizeof(int)*N);//和傳過來的參數(shù)有關(guān),O(N)int* a=(int*)malloc(sizeof(int)*3);//和傳過來的參數(shù)無關(guān),O(1)

NO.2 斐波那契數(shù)列

// 計(jì)算Fibonacci的空間復(fù)雜度?// 返回斐波那契數(shù)列的前n項(xiàng)long long* Fibonacci(size_t n){     if(n==0)     return NULL;
     long long * fibArray = (long long *)malloc((n+1) * sizeof(long long));     fibArray[0] = 0;     fibArray[1] = 1;     for (int i = 2; i <= n ; ++i)     {      fibArray[i] = fibArray[i - 1] + fibArray [i - 2];     }     return fibArray;}

和上面的斐波那契數(shù)列的遞歸代碼不同,這里我們新創(chuàng)建了一個(gè)數(shù)組,用來保存計(jì)算出來的斐波那契數(shù)

一共malloc了n+1個(gè)長(zhǎng)整型的空間,空間復(fù)雜度是O(N)

空間重復(fù)使用問題

如果是遞歸方法的斐波那契算法,其空間復(fù)雜度是多少呢?

long long Fib(size_t N){     if(N < 3)      return 1;
     return Fib(N-1) + Fib(N-2);}

答案也是O(N)

因?yàn)閷?duì)于遞歸算法而言,其開辟的函數(shù)棧幀空間是可以重復(fù)利用的!

如fib(8)的調(diào)用,其開辟的函數(shù)棧幀,是可以在后續(xù)繼續(xù)調(diào)用fib函數(shù)時(shí)重復(fù)使用的

d7abb4a2-2840-11ed-ba43-dac502259ad0.png

上圖中f1和f2是兩個(gè)函數(shù),但執(zhí)行了相同的功能。其函數(shù)調(diào)用的空間實(shí)際上是一個(gè),f2在f1銷毀后繼承了它的空間

這就好比每一次新的遞歸都會(huì)開一家新的飯店,但是你下次還想吃東北菜的時(shí)候,可以去之前開的東北菜館,咱沒必要讓別人再開一家館子不是嘛?

不過由于斐波那契數(shù)的遞歸算法會(huì)遞歸非常多次,在數(shù)字很大的時(shí)候,會(huì)導(dǎo)致棧溢出

d7b9667e-2840-11ed-ba43-dac502259ad0.png

NO.3 階乘

long long Fac(size_t N){     if(N == 0)      return 1;
     return Fac(N-1)*N;}

雖然函數(shù)本身的空間不計(jì)入時(shí)間復(fù)雜度,這里計(jì)算的是遞歸調(diào)用時(shí)額外開辟的函數(shù)棧幀空間

一共調(diào)用了N-1次,每個(gè)棧幀使用了常數(shù)個(gè)空間,空間復(fù)雜度是O(N)

常見復(fù)雜度對(duì)比

d7d42522-2840-11ed-ba43-dac502259ad0.png

d8a345d2-2840-11ed-ba43-dac502259ad0.png

結(jié)語

時(shí)間復(fù)雜度和空間復(fù)雜度可以幫我們很好的了解自己所寫算法的好壞,在未來面試的時(shí)候,HR肯定也更喜歡效率高的算法

要多刷題,好好積累自己的能力,想必之后寫出好算法也是水到渠成(吧?)

審核編輯:湯梓紅

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

    關(guān)注

    23

    文章

    4630

    瀏覽量

    93352
  • 計(jì)算
    +關(guān)注

    關(guān)注

    2

    文章

    451

    瀏覽量

    38866
  • 復(fù)雜度
    +關(guān)注

    關(guān)注

    0

    文章

    8

    瀏覽量

    7929

原文標(biāo)題:【算法】幾分鐘時(shí)間讓你徹底學(xué)會(huì)—空間復(fù)雜度!

文章出處:【微信號(hào):cyuyanxuexi,微信公眾號(hào):C語言編程學(xué)習(xí)基地】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于紋理復(fù)雜度的快速幀內(nèi)預(yù)測(cè)算法

    【正文快照】:0引言幀內(nèi)編碼利用相鄰像素塊之間的相關(guān)[1]來減少視頻圖像的空間冗余,提高了編碼效率。但是在H.264/AVC的幀內(nèi)預(yù)測(cè)采用全搜索算法中,為了確定一個(gè)宏塊的最優(yōu)預(yù)測(cè)模式,要遍歷色度塊和亮度塊的17種預(yù)測(cè)模式,計(jì)算
    發(fā)表于 05-06 09:01

    時(shí)間復(fù)雜度是指什么

    原理->微機(jī)原理->軟件工程,編譯原理,數(shù)據(jù)庫(kù)數(shù)據(jù)結(jié)構(gòu)1.時(shí)間復(fù)雜度時(shí)間復(fù)雜度是指執(zhí)行算法所需要的計(jì)算工作量,因?yàn)檎麄€(gè)算法的執(zhí)行時(shí)間與基本操作重復(fù)執(zhí)行的...
    發(fā)表于 07-22 10:01

    各種排序算法的時(shí)間空間復(fù)雜度、穩(wěn)定性

    各種排序算法的時(shí)間空間復(fù)雜度、穩(wěn)定性一、排序算法分類:二、排序算法比較:注:1、歸并排序可以通過手搖算法
    發(fā)表于 12-21 07:48

    LDPC碼低復(fù)雜度譯碼算法研究

    在描述置信傳播(BP)譯碼算法基礎(chǔ)上, 研究和分析了兩種降低復(fù)雜度的譯碼算法。Min.Sum 算法主要討論了簡(jiǎn)化校驗(yàn)節(jié)點(diǎn)的消息更新運(yùn)算,并應(yīng)用密度進(jìn)化方法對(duì)此
    發(fā)表于 03-31 15:22 ?7次下載
    LDPC碼低<b class='flag-5'>復(fù)雜度</b>譯碼<b class='flag-5'>算法</b>研究

    圖像復(fù)雜度對(duì)信息隱藏性能影響分析

    算法進(jìn)行實(shí)驗(yàn),研究圖像的復(fù)雜度差異對(duì)信息隱藏性能的影響。實(shí)驗(yàn)結(jié)果表明了所提復(fù)雜度評(píng)價(jià)方法的有效性以及復(fù)雜度分類的合理性,依據(jù)圖像復(fù)雜度準(zhǔn)則對(duì)
    發(fā)表于 11-14 09:57 ?5次下載

    虛擬MIMO中低復(fù)雜度功率分配算法

    一種基于線性注水原理的低復(fù)雜度功率分配算法。該算法通過快速排除信道條件較差的協(xié)作用戶,并利用各協(xié)作用戶功率值之間的線性遞推關(guān)系式,將最優(yōu)功率分配算法中的迭代運(yùn)算轉(zhuǎn)化為線性運(yùn)算,在實(shí)現(xiàn)功
    發(fā)表于 03-09 15:22 ?1次下載
    虛擬MIMO中低<b class='flag-5'>復(fù)雜度</b>功率分配<b class='flag-5'>算法</b>

    算法是什么?python的時(shí)間,空間復(fù)雜度和常用算法實(shí)例說明免費(fèi)下載

    一個(gè)算法有缺陷,或不適合于某個(gè)問題,執(zhí)行這個(gè)算法將不會(huì)解決這個(gè)問題。不同的算法可能用不同的時(shí)間、空間或效率來完成同樣的任務(wù)。一個(gè)算法的優(yōu)劣可
    發(fā)表于 09-29 08:00 ?3次下載
    <b class='flag-5'>算法</b>是什么?python的時(shí)間,<b class='flag-5'>空間</b><b class='flag-5'>復(fù)雜度</b>和常用<b class='flag-5'>算法</b>實(shí)例說明免費(fèi)下載

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

    那么我通過一道簡(jiǎn)單的面試題,模擬面試的場(chǎng)景,來帶大家逐步分析遞歸算法的時(shí)間復(fù)雜度,最后找出最優(yōu)解,來看看同樣是遞歸,怎么就寫成了O(n)的代碼。
    的頭像 發(fā)表于 07-13 11:30 ?2313次閱讀

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

    相信很多同學(xué)對(duì)遞歸算法的時(shí)間復(fù)雜度都很模糊,那么這篇Carl來給大家通透的講一講。
    的頭像 發(fā)表于 07-13 11:33 ?1663次閱讀

    常見機(jī)器學(xué)習(xí)算法的計(jì)算復(fù)雜度

    時(shí)間復(fù)雜度不是測(cè)量一個(gè)算法或一段代碼在某個(gè)機(jī)器或者條件下運(yùn)行所花費(fèi)的時(shí)間。時(shí)間復(fù)雜度一般指時(shí)間復(fù)雜性,時(shí)間復(fù)雜度是一個(gè)函數(shù),它定性描述該
    發(fā)表于 10-02 12:45 ?841次閱讀

    算法時(shí)空復(fù)雜度分析實(shí)用指南1

    我以前的文章主要都是講解算法的原理和解題的思維,對(duì)時(shí)間復(fù)雜度空間復(fù)雜度的分析經(jīng)常一筆帶過,主要是基于以下兩個(gè)原因:
    的頭像 發(fā)表于 04-12 14:37 ?552次閱讀
    <b class='flag-5'>算法</b>時(shí)空<b class='flag-5'>復(fù)雜度</b>分析實(shí)用指南1

    算法時(shí)空復(fù)雜度分析實(shí)用指南2

    類似的,想想之前說的數(shù)據(jù)結(jié)構(gòu)擴(kuò)容的場(chǎng)景,也許`N`次操作中的某一次操作恰好觸發(fā)了擴(kuò)容,導(dǎo)致時(shí)間復(fù)雜度提高,但總的時(shí)間復(fù)雜度依然保持在`O(N)`,所以均攤到每一次操作上,其平均時(shí)間復(fù)雜度依然是`O(1)`。
    的頭像 發(fā)表于 04-12 14:38 ?567次閱讀
    <b class='flag-5'>算法</b>時(shí)空<b class='flag-5'>復(fù)雜度</b>分析實(shí)用指南2

    算法時(shí)空復(fù)雜度分析實(shí)用指南(上)

    本文會(huì)篇幅較長(zhǎng),會(huì)涵蓋如下幾點(diǎn): 1、Big O 表示法的幾個(gè)基本特點(diǎn)。 2、非遞歸算法中的時(shí)間復(fù)雜度分析。 3、數(shù)據(jù)結(jié)構(gòu) API 的效率衡量方法(攤還分析)。 4、遞歸算法的時(shí)間/
    的頭像 發(fā)表于 04-19 10:34 ?886次閱讀
    <b class='flag-5'>算法</b>時(shí)空<b class='flag-5'>復(fù)雜度</b>分析實(shí)用指南(上)

    算法時(shí)空復(fù)雜度分析實(shí)用指南(下)

    Big O 表示法的幾個(gè)基本特點(diǎn)。 2、非遞歸算法中的時(shí)間復(fù)雜度分析。 3、數(shù)據(jù)結(jié)構(gòu) API 的效率衡量方法(攤還分析)。 4、遞歸算法的時(shí)間/空間
    的頭像 發(fā)表于 04-19 10:35 ?741次閱讀
    <b class='flag-5'>算法</b>時(shí)空<b class='flag-5'>復(fù)雜度</b>分析實(shí)用指南(下)

    如何計(jì)算時(shí)間復(fù)雜度

    1 算法與時(shí)間復(fù)雜度 算法(Algorithm)是求解一個(gè)問題需要遵循的,被清楚指定的簡(jiǎn)單指令的集合。 算法一旦確定,那么下一步就要確定該算法
    的頭像 發(fā)表于 10-13 11:19 ?3097次閱讀
    如何計(jì)算時(shí)間<b class='flag-5'>復(fù)雜度</b>
    娱乐百家乐官网下载| 百家乐高手心得| 24山 分金 水口 论 吉凶| 百家乐官网机器图片| 澳门百家乐官网大家乐眼| 百家乐官网实战技术| 新竹县| 赌博堕天录 和也篇| 六合彩报码室| 大发888黄金版娱乐场| 大发888真钱娱乐游戏| 幸运水果机电脑版| 威尼斯人娱乐城真钱游戏| 巴厘岛百家乐娱乐城| 百家乐押注最高是多少| 波音百家乐自动投注| 百家乐怎样玩才能赢| 金公主百家乐现金网| 在线百家乐有些一| 百家乐如何打公式| 百家乐小77论坛| 百家乐怎样玩才能赢| 百家乐网络游戏平台| 超级百家乐2龙虎斗| 百家乐赌场分析网| 伯爵百家乐娱乐平台| 百家乐官网赌场网| 七胜百家乐官网娱乐平台| 百家乐官网国际娱乐场| 网上百家乐官网是真是假天涯论坛| 在线百家乐官网电脑| 九州百家乐官网的玩法技巧和规则| 百家乐官网大光明影院| 做生意风水门面要求| 属虎属鼠做生意可以吗| 百家乐长路投注法| 百家乐路单免费下载| 百家乐网站制作| 江山百家乐的玩法技巧和规则| 免费百家乐倍投工具| 大发888娱乐城客户端下载|