色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

一文徹底了解時間復雜度

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

算法在編寫成可執行程序的時候,main函數使用這個算法,需要調用一定的空間,消耗一定的時間。算法的效率就是通過空間和時間這兩個維度來評判的。

時間復雜度:衡量一個算法的運行速度

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

那么我們今天先來看看時間復雜度!

79c67cb2-25db-11ed-ba43-dac502259ad0.png

時間復雜度

算法的時間復雜度是一個函數,它定量描述了該算法的運行時間。算法中基本操作的執行次數,為算法的時間復雜度

時間復雜度是一個近似值,并不是實際運行的時間

實際上代碼的運行時間,和機器的內存、cpu性能和平臺都有關系,同一個代碼在不同的機器上運行時間都不一樣,如果只以純粹的時間來考核,很難分析

找到某條基本語句與問題規模N之間的數學表達式,就算出了該算法的時間復雜度

void Test(int N){    int count =0;    for(int i=0;i    {        for(int j=0;j        {            count++;        }    }        for (int k = 0; k < 2 * N ; ++ k)    {        count++;    }        int M = 10;    while (M--)    {        count++;    }        return;}

請問這個代碼中,count語句執行了幾次?

F ( N ) = N 2 + 2 ? N + 10 F(N)=N^2+2*N+10 F(N)=N2+2?N+10

N = 10 F(N) = 130

N = 100 F(N) = 10210

N = 1000 F(N) = 1002010

你可能會簡單地認為,F(N)的結果就是我們的時間復雜度。其實并不然,我們并不需要一個精確的運行次數,只需要知道程序運行次數的量級就行了

這里我們使用大O漸進表示法來表示時間復雜度(空間復雜度同理)

2.1大O的漸進表示法

大O符號(Big O notation):是用于描述函數漸進行為的數學符號

推導大O階方法:

(1)用常數1取代運行時間中的所有加法常數。

(2)在修改后的運行次數函數中,只保留最高階項。

(3)如果最高階項存在且不是1,則去除與這個項目相乘的常數。得到的結果就是大O階

使用這種方法后,test1函數的時間復雜度為

O ( N 2 ) O(N^2) O(N2)

對于test1函數,在計算的時候,我們省略了最后的+10,保留了最高階數N2,即得出了它的時間復雜度

如果最高階數前面有系數,如2N,系數也將被省略

因為當N的數值很大的時候,后面的那些值對我們總運行次數的影響已經非常小了。大O的漸進表示法去掉了那些對結果影響不大的項,簡潔明了的表示出了執行次數

2.2多種情況取最壞

一些算法的時間復雜度會有最好、最壞和平均的情況

最好情況:任意輸入規模的最小運行次數(下界)

平均情況:期望的運行次數

最壞情況:任意輸入規模的最大運行次數(上界)

舉個例子,當我們編寫一個在數組中查找數值的算法時,它可能會出現這幾種情況:

最好情況:1次就找到

平均情況:N/2次

最壞情況:N次

在實際中的一般情況,我們關注的是算法的最壞運行情況,所以數組中搜索數據時間復雜度為O(N)

2.3常見時間復雜度的計算

NO.1

void Func1(int N){     int count = 0;     for (int k = 0; k < 2 * N ; ++ k)     {      ++count;     }     int M = 10;     while (M--)     {      ++count;     }  printf("%d
", count);}

這里出現了兩個循環,分別是2N次和10次。前面提到了大O漸進法只保留最高階數并省略系數,所以它的時間復雜度是O(N)

NO.2

void Func2(int N, int M){     int count = 0;     for (int k = 0; k < M; ++ k)     {      ++count;     }     for (int k = 0; k < N ; ++ k)     {      ++count;     }     printf("%d
", count);}

這里出現了次數為N和M的兩層循環:

當M和N差不多大的時候,時間復雜度可以理解為O(M)或O(N)

當M遠遠大于N時,時間復雜度為O(M)

一般情況取O(M+N)

NO.3 常數階

void Func3(int N){     int count = 0;     for (int k = 0; k < 100; ++ k)     {      ++count;     }     printf("%d
", count);}

這里我們得知了具體的循環次數為100,是一常數,時間復雜度為O(1),代表常數階

只要循環次數已知,為一常數且和所傳參數無關,其時間復雜度即為O(1)

NO.4 strchr

//計算strchr的時間復雜度const char * strchr ( const char * str, int character );

看到這道題的時候,你可能會一愣,strchr是什么?

可這里面沒有strchr,但有strstr

strstr函數的作用:在字符串1中尋找是否有字符串2

其中第二個str代表的是string字符串,那我們是不是可以猜想,chr代表的是char字符,其作用是在一個字符串中查找是否有一個字符呢?

當然,光是猜想肯定是不夠的,我們還需要求證一下

打開cplusplus網站,搜索strchr,即可轉到函數定義

79d4df00-25db-11ed-ba43-dac502259ad0.png

可以看到,該函數的作用是定位字符串中第一次出現該字符的位置,返回值是一個pointer指針

和我們猜想的一樣,它的作用就是在字符串中查找一個字符,并返回它第一次出現的位置的地址。

這樣一來,strchr函數的時間復雜度就很清楚了,就是遍歷字符串所需要的次數,O(N)

NO.5 冒泡排序

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

冒泡排序是一個非常經典的代碼,其思路就是遍歷整個數組,如果待排序數字大于它的下一位,則交換這兩個數字

N個數字的數組需要N-1次排序才能完成

每一次排序都需要遍歷一次數組

這樣算來,冒泡排序的循環次數就是兩個N,即為O(N2)

能否通過循環層級判斷?

細心的你可能會發現,上述代碼中出現了兩層循環,那是不是可以通過循環層級來判斷時間復雜度呢?

并不能!

for(int i=0;i{  for(int j=0;j<3;j++)    printf("hehe
");}

如果是上述這種兩次循環的情況,會打印3n次呵呵,其時間復雜度是O(N)而不是N2

我們要準確分析算法的思路,并不能簡單地通過循環層級來判斷時間復雜度

NO.6 二分查找

intBinarySearch(int*a,intn,intx){assert(a);intbegin=0;intend=n-1;while(beginend){intmid=begin+((end-begin)>>1);//使用位移操作符來模擬/2,防止beginend相加后超出int范圍if(a[mid]begin=mid+1;elseif(a[mid]>x)end=mid;elsereturnmid;}return-1;}

二分查找的思路這里不再贅述

假設我們找了x次,每一次查找都會使查找范圍減半

N/2/2/2/2 ……

最后我們可以得出2條公式

2 x = N 2^x=N 2x=N

x = l o g 2 N x=log_2N x=log2N

最好情況:O(1)

最壞情況:O(logN)

79e08bac-25db-11ed-ba43-dac502259ad0.png

通過時間復雜度的對比,我們就能看出二分查找的優勢在那里了

7a15a288-25db-11ed-ba43-dac502259ad0.png

可以看到,當數據很大的時候,O(logN)的算法執行次數比O(N)少了特別多!!(來自BT-7274的肯定)

NO.7 計算N!

// 計算階乘遞歸Fac的時間復雜度?long long Fac(size_t N){     if(0 == N)      return 1;
     return Fac(N-1)*N;}

對于這個階乘的遞歸函數而言,每次函數調用是O(1),時間復雜度主要看遞歸次數

對于數字N而言,遞歸需要N次,時間復雜度是O(N)

遞歸算法時間復雜度計算

如果每次函數調用是O(1),看遞歸次數

每次函數調用不是O(1),那么就看他遞歸調用中次數的累加

NO.8 斐波那契數列

// 計算斐波那契遞歸Fib的時間復雜度?long long Fib(size_t N){     if(N < 3)      return 1;
     return Fib(N-1) + Fib(N-2);}

7a6d0c94-25db-11ed-ba43-dac502259ad0.png

每次遞歸,次數都會增加,總的來說是以2^x的量級增加的(x代表行數)

1 + 2 + 4 + 8 + … … + 2 X ? 2 1+2+4+8+……+2^{X-2} 1+2+4+8+……+2X?2

這里一共有x-1項,用等比數列的求和公式得出,結果為2x-1

所以最后得出的時間復雜度為O(2N)

需要注意的是,當遞歸調用到底部時,有一些調用會較早退出,這部分位于金字塔的右下角

7a94b848-25db-11ed-ba43-dac502259ad0.png

由于時間復雜度只是一個估算值,這一部分缺失的調用次數對總運行次數的影響不大,故忽略掉

NO.9

void fun(int n) {   int i=l;   while(i<=n)      i=i*2;}

此函數有一個循環,但是循環沒有被執行n次,i每次都是2倍進行遞增,所以循環只會被執行log2n次

NO.10

給定一個整數sum,從有N個有序元素的數組中尋找元素a,b,使得a+b的結果最接近sum,最快的平均時間復雜度是?

A. O(n)//√B. O(n^2)C. O(nlogn)D. O(logn)

數組元素有序,所以a,b兩個數可以分別從開始和結尾處開始搜,根據首尾元素的和是否大于sum,決定搜索的移動,整個數組被搜索一遍,就可以得到結果,所以最好時間復雜度為n

審核編輯:湯梓紅


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

    關注

    23

    文章

    4629

    瀏覽量

    93193
  • 函數
    +關注

    關注

    3

    文章

    4345

    瀏覽量

    62879
  • 復雜度
    +關注

    關注

    0

    文章

    8

    瀏覽量

    7928

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

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

收藏 人收藏

    評論

    相關推薦

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

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

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

    , 不知道如何區分普通和復雜的PCB和 PCBA的設計,并采用什么樣的方式來處理。 基于上述考慮, 我們參考了業 界已有的作法, 設計了個PCB 和 PCBA的工藝復雜度計算公式以解決這 方面
    發表于 06-14 11:15

    JEM軟件復雜度的增加情況

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

    時間復雜度是指什么

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

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

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

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

    針對信息隱藏中載體圖像的差異性,提出種圖像復雜度評價方法,綜合考慮圖像的壓縮特性以及圖像紋理能量作為圖像復雜度指標,并基于閾值劃分準則對栽體圖像進行復雜度分類,以幾種經典的基于直方圖
    發表于 11-14 09:57 ?5次下載

    深度剖析時間復雜度

    相信每位錄友都接觸過時間復雜度,但又對時間復雜度的認識處于種朦朧的狀態,所以是時候對
    的頭像 發表于 03-18 10:18 ?1916次閱讀

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

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

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

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

    算法之空間復雜度

    算法之空間復雜度:衡量個算法運行需要開辟的額外空間
    的頭像 發表于 08-31 10:29 ?1640次閱讀

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

    時間復雜度不是測量個算法或段代碼在某個機器或者條件下運行所花費的時間時間
    發表于 10-02 12:45 ?830次閱讀

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

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

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

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

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

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

    如何計算時間復雜度

    1 算法與時間復雜度 算法(Algorithm)是求解個問題需要遵循的,被清楚指定的簡單指令的集合。 算法旦確定,那么下步就要確定該算
    的頭像 發表于 10-13 11:19 ?3064次閱讀
    如何計算<b class='flag-5'>時間</b><b class='flag-5'>復雜度</b>
    主站蜘蛛池模板: 亚洲中文字幕日本在线观看 | 亚洲精品免费视频 | 国产三级级在线电影 | 99久久亚洲精品影院 | 在线看免费毛片 | 亚洲精品视频久久 | 俄罗斯aaaa一级毛片 | 日韩欧无码一区二区三区免费不卡 | WWW国产无套内射久久 | 校花娇喘呻吟校长陈若雪视频 | 亚洲免费视频观看 | 夜色私人影院永久入口 | 日本人六九视频 | 97色色极品av影院 | 无套内射CHINESEHD熟女 | 伊人香蕉在线播放视频免费 | 亚洲午夜性春猛交XXXX | 精品亚洲国产熟女福利自在线 | 双性大乳浪受噗呲噗呲h总 双性被疯狂灌满精NP | 老板揉搓秘书丰满大乳 | 久久精品麻豆国产天美传媒果冻 | 夜夜骑夜夜欢 | 亚洲精品久久午夜麻豆 | 国产麻豆剧果冻传媒免费网站 | 精品国产免费观看久久久 | 桃花免费高清在线观看 | 一一本之道高清视频在线观看中文字幕 | 国产无遮挡色视频免费观看性色 | 入禽太深视频免费视频 | 国产成人亚洲精品老王 | 2021久久精品免费观看 | 在线日本高清日本免费 | 无套内射CHINESEHD熟女 | 亚洲视频91 | 久啪久久全部视频在线 | 中文在线观看永久免费 | 黑人巨茎大战白人女40CMO | 免费看亚洲 | 四虎永久免费网址 | 9亚洲欧洲免费无码在线 | 久久精品人人做人人爽97 |