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

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

3天內不再提示

算法之空間復雜度

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

算法之空間復雜度:衡量一個算法運行需要開辟的額外空間

上次我們學習了時間復雜度,那么我們今天就來看看空間復雜度!

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

概念

空間復雜度是對一個算法在運行過程中臨時占用空間大小的度量

和時間復雜度不是真的計算時間一樣,空間復雜度也不衡量算法具體占用的內存字節數。

空間復雜度計算的是額外開辟的變量的個數,適用大O漸近法

注意:函數運行時所需要的??臻g(存儲參數、局部變量、一些寄存器信息等)在編譯期間已經確定好了,因此空間復雜度主要通過函數在運行時候顯式申請的額外空間來確定。

空間復雜度計算

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;     }}

我們會發現,冒泡排序算法并沒有額外定義非常多的變量,一共只有3個,屬于常數階

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

其空間復雜度為O(1)

計算時注意其與N的關系

當我們在算法中開辟空間,計算空間復雜度的時候,要注意開辟的這個空間與N有沒有關系

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

NO.2 斐波那契數列

// 計算Fibonacci的空間復雜度?// 返回斐波那契數列的前n項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;}

和上面的斐波那契數列的遞歸代碼不同,這里我們新創建了一個數組,用來保存計算出來的斐波那契數

一共malloc了n+1個長整型的空間,空間復雜度是O(N)

空間重復使用問題

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

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

答案也是O(N)

因為對于遞歸算法而言,其開辟的函數棧幀空間是可以重復利用的!

如fib(8)的調用,其開辟的函數棧幀,是可以在后續繼續調用fib函數時重復使用的

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

上圖中f1和f2是兩個函數,但執行了相同的功能。其函數調用的空間實際上是一個,f2在f1銷毀后繼承了它的空間

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

不過由于斐波那契數的遞歸算法會遞歸非常多次,在數字很大的時候,會導致棧溢出

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

NO.3 階乘

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

雖然函數本身的空間不計入時間復雜度,這里計算的是遞歸調用時額外開辟的函數棧幀空間

一共調用了N-1次,每個棧幀使用了常數個空間,空間復雜度是O(N)

常見復雜度對比

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

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

結語

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

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

審核編輯:湯梓紅

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

    關注

    23

    文章

    4474

    瀏覽量

    91107
  • 計算
    +關注

    關注

    2

    文章

    432

    瀏覽量

    38507
  • 復雜度
    +關注

    關注

    0

    文章

    8

    瀏覽量

    7884

原文標題:【算法】幾分鐘時間讓你徹底學會—空間復雜度!

文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學習基地】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    意法半導體推出低壓工業應用高集成度三相半橋驅動器IC

    算法設計過程中,如果所設計的算法時間復雜度很高達不到要求,且所需算法空間復雜度要求不高時。
    發表于 12-25 15:39 ?805次閱讀

    基于紋理復雜度的快速幀內預測算法

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

    JEM軟件復雜度的增加情況

    這篇文檔展示了幾個機構關于JEM軟件復雜度的增加情況的看法,特別提出來創立一個新的Ad-hoc組,研究降低軟件一般性復雜度的可能方法。
    發表于 07-19 08:25

    如何降低LMS算法的計算復雜度,加快程序在DSP上運行的速度,實現DSP?

    基于線性預測的FIR自適應語音濾波器的系統結構由那幾部分組成?如何降低LMS算法的計算復雜度,加快程序在DSP上運行的速度,實現DSP?
    發表于 04-12 06:27

    求一種基于802.16d的低復雜度的幀同步和定時同步聯合算法

    本文參考IEEE 802.16d物理層幀結構,提出了一種低復雜度的幀同步和定時同步聯合算法,該算法可在FPGA上利用較少資源來實現。
    發表于 05-06 06:23

    時間復雜度是指什么

    原理->微機原理->軟件工程,編譯原理,數據庫數據結構1.時間復雜度時間復雜度是指執行算法所需要的計算工作量,因為整個算法的執行時間與基本操作重復執行的...
    發表于 07-22 10:01

    各種排序算法的時間空間復雜度、穩定性

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

    非阻塞模式LCD多級菜單實現與應用

    提出一種非阻塞模式LCD多級菜單的設計,分析了菜單的樹形結構,給出了菜單的狀態轉換模型及其菜單的核心數據結構. 并分析菜單實現算法的較小空間復雜度和給出了其數據結構的C51的實
    發表于 02-15 09:58 ?38次下載
    非阻塞模式LCD多級菜單實現與應用

    基于分布式的時間序列局部相似性檢測

    基于動態時間規整算法思想的CrossMatch算法可以用來解決序列間的部分相似問題,但是由于算法時間空間復雜度過高,需要消耗大量的計算資源,
    發表于 12-08 17:16 ?0次下載

    算法是什么?python的時間,空間復雜度和常用算法實例說明免費下載

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

    如何求遞歸算法的時間復雜度

    相信很多同學對遞歸算法的時間復雜度都很模糊,那么這篇Carl來給大家通透的講一講。
    的頭像 發表于 07-13 11:33 ?1397次閱讀

    算法時空復雜度分析實用指南1

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

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

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

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

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

    如何計算時間復雜度

    1 算法與時間復雜度 算法(Algorithm)是求解一個問題需要遵循的,被清楚指定的簡單指令的集合。 算法一旦確定,那么下一步就要確定該算法
    的頭像 發表于 10-13 11:19 ?1206次閱讀
    如何計算時間<b class='flag-5'>復雜度</b>
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>