精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

    文章

    4601

    瀏覽量

    92673
  • 計算
    +關注

    關注

    2

    文章

    446

    瀏覽量

    38740
  • 復雜度
    +關注

    關注

    0

    文章

    8

    瀏覽量

    7901

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

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

收藏 人收藏

    評論

    相關推薦

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

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

    時間復雜度是指什么

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

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

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

    LDPC碼低復雜度譯碼算法研究

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

    圖像復雜度對信息隱藏性能影響分析

    算法進行實驗,研究圖像的復雜度差異對信息隱藏性能的影響。實驗結果表明了所提復雜度評價方法的有效性以及復雜度分類的合理性,依據圖像復雜度準則對
    發表于 11-14 09:57 ?5次下載

    虛擬MIMO中低復雜度功率分配算法

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

    算法是什么?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>實例說明免費下載

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

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

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

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

    常見機器學習算法的計算復雜度

    時間復雜度不是測量一個算法或一段代碼在某個機器或者條件下運行所花費的時間。時間復雜度一般指時間復雜性,時間復雜度是一個函數,它定性描述該
    發表于 10-02 12:45 ?801次閱讀

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

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

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

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

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

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

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

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

    如何計算時間復雜度

    1 算法與時間復雜度 算法(Algorithm)是求解一個問題需要遵循的,被清楚指定的簡單指令的集合。 算法一旦確定,那么下一步就要確定該算法
    的頭像 發表于 10-13 11:19 ?2821次閱讀
    如何計算時間<b class='flag-5'>復雜度</b>