日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

分析时间复杂度和空间复杂度(一级)

發布時間:2024/4/13 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分析时间复杂度和空间复杂度(一级) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

什么叫時間復雜度,并且告訴大家我們一般求時間最壞復雜度,下邊我們該怎么求時間復雜度呢,沒有必要去求他真實的計算次數,所以我們最后把這個問題簡化了,怎么來簡化?1. 找出算法中的基本語句,基本語句是哪個語句呢,一般來說是執行次數最多的那條語句,其他的都可以省略,找算法中的基本語句,算法中執行次數最多的那條語句就是基本語句2. 然后我們只要計算基本語句的執行次數的級別就可以了3. 最后用大O來表示下邊我們都舉幾個列子都挺簡單的 時間復雜度舉例(1)----------------------------------------------------一個簡單語句的時間復雜度為O(1).int count = 1;他的時間復雜度是多少,我們不是應該這么求嗎,T(n)=1,因為一條語句他的執行次數就是一次,這不叫時間復雜度,這叫時間頻度,時間復雜度是怎么來的,T(n)=O(1),第一步找出基本語句,他的執行次數就一次,再用大歐來表示,他沒有低次冪,只有常數項,這用1來表示就可以了(2)-----------------------------------------------------100個簡單語句的事件復雜度也為O(1).int count = 0; int count = 0; int count = 0; ........ int count = 0;int不能重復的定義,一共一百條語句,請你告訴我,他的執行次數,他的時間復雜度是多少,找出基本語句,每個語句執行一次,那就是T(n)=1,T(n)=O(1),還是1,我不找基本語句,只是100條語句,他的執行次數是100,T(n)=100,不找基本語句,所有的語句執行次數是100,T(n)=100,但是時間復雜度來求的話100都要去掉,去掉之后就變成1了,T(n)=O(1),有人說這里是100條,但是這里不管是1萬條還是10萬條,這里最后還是1,因為10萬條還是個有限的數,他也是個常數,這一點大家明確(3)----------------------------------------------------一個循環的時間復雜度為O(n)int n = 8,count = 0;for(int i=1;i<=n;i++){count++; }一個循環的事件復雜度,n等于8,count等于0,for循環循環幾次,count加加,注意啊,你不要看這個8,因為這次給個8,下次給的可能就不是8了,也可能是給個無窮大的數,他就是個變量,請問他的時間復雜度是多少,注意了,要找基本語句,基本語句是不是int n = 8,count = 0這條語句,基本語句執行次數最多的語句,最多的是count++,有些人會說最多的是i<=n,不計較這個,計較這個有意義嗎,是沒有意義,我們找循環體就可以了,那你想一下,count++這個他應該執行多少次,我們要寫T(n),告訴我他執行多少次,那是不是和n有關,那就執行n次吧,T(n)=n,T(n)=n+1,和T(n)=n-1次這個沒關系,我們就n次,這個n就可以了,不影響結果,然后怎么辦,如果T(n)用時間復雜度來表示,寫一個大歐還是n,T(n)=O(n),還是n就可以了,n相當于一個變量,我想問大家一下,如果我這里寫的是10n+100,for(int i=1;i<=10n+100;i++),請告訴我,他的時間度是多少,那他的T(n)=10n+100,這個是時間頻度,但是我們是看復雜度,看他規模就可以了,怎么看呢,常數項100去掉,10n的系數10也去了,是不是還是n,多做幾個就明白了,是O(n)(4)------------------------------------------------------時間復雜度為O(log2 n)的循環語句int n = 5,count = 0;for(int i=1;i<=n;i*=2){count++; }有人說這個語句和上面的語句一樣啊,不一樣,哪兒不一樣?關鍵是這兒i*=2,這兒不一樣,i乘等于2,這個時間度是多少,它執行多少次,你知道i*=2是什么含義嗎,第一次它是1,然后他變成幾了,它變成2,然后就變成4,然后變成8,然后16,然后32,有人說這個變化也不快,這還叫不快嗎,好像大家都還聽說過一個故事,什么故事啊,什么印度一個國王,向國際象棋發明者老智者要賞賜他了我賞賜你糧食吧,一個國際象棋的棋盤,一共64個格,第一個格放一個,第二個放2個,第三個放4個,第四個放8個,當時國王發現整個國家的糧食放進來也放不夠,為什么啊,只有64個格,他就放不下了,別說64個格,想一下30個格就是多少,1是2的0次方,2是2的一次方,4是2的2次方,30個格那不就是2的30次方,2的30次方是多少啊,這對我們學計算機的來說應該很清楚啊,不就是2的10次方乘以2的10次方,再乘以2的10次方,那不就是1024*1024*1024,我們簡單一下=1000*1000*1000,就是10的9次方,就是10億,想說明一個什么意思,也就是說,對于我們上面這個來說,我們最后寫的這個數,如果我們呢這個數是n,他等于10億的話,這個i++,每次加的話,如果這個數是10億的話,它這個循環得循環多少次,i++一直變到10億,10億次,但是如果用(int i=1;i<=n;i*=2)這種方式的話幾次就可以了,如果這個n是10億的話,30次左右就可以了,有沒有想到我這個30次和10億次的差別,還是很大的,這種算法告訴我,我知道10億了,我知道這個n了,我怎么知道n的多少次方就等于n了,log2 n,一個叫做指數,一個叫做對數,反過來的,有的人說我有點糊涂了,我們在這里不做過多的糾結,在這種情況下,我們要掌握兩點,第一點log2 n的話,他的效率是特別高,你就想這個30次跟10億次的差別就可以了,想那個差別就可以了,如果你以后設計了一種算法,從O(n)到O(log2 n),那你太棒了,如果你再實現一種算法復雜度是O(1),那你就更厲害,這個大家明確了,這個log2 n就指數的反過來,2的30次方就是10億,這里特別標記一下,好好的想一下這一塊(5)--------------------------------------------------------------時間復雜度為O(n2)的二重循環.int n = 8,count=0;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){count++;} }大家一定要記住,有人說這個有點難,難你不學肯定學不會,不可能瞇一會睜開眼就回來,我們學就是學別人不會的,就學這些唄,學一些難的內容,別人學不會我們會的,第三點這個真的很難嗎,我們今天就可以掌握就變成自己的了,這差距有時候就是這么來產生的,告訴我這個時間復雜度是多少,先找基本語句,基本語句是count++唄,這是基本語句,告訴我j<n是從1開始的,i小于n也是1開始的,我們不說別的,里循環,里循環小循環多少次,從1到n次,這個n次有幾個n次,這外循環又是n次,那不就是n乘以n嗎,所以他的復雜度是O(n2),如果我這里要是10n呢,for(int j=1;j<=10n;j++),我這里是100n呢,for(int i=1;i<=100n;i++),級別是不是還是n的平方時間復雜度嗎,T(n)=100n*10n最后等于多少,最后等于1000n*10n,那我們要用時間復雜度來說,就等于T(n)=O(n*n),一步一步來,(6)--------------------------------------------------------------------時間復雜度為O(nlog2 n)的二重循環int n = 8,count = 0;for(int i=1;i<=n;i*=2){for(int j=1;j<=n;j++){count++;} }總覺得很相似,j小于等于n,i小于等于n一樣啊? i*=2這兒不一樣,是不是這兒不一樣,雙重循環,這里多少,在這個里循環里面多少次,里循環里面n次,他有多少個n次,他有多少個小循環,log2 n唄, 所以他整個的時間復雜度就是n*log2 n,寫他就可以,O(log2 n*n),這個大家明確了(7)-----------------------------------------------------------------------------時間復雜度為O(n2)的二重循環.int n =8,count = 0;for(int i=1;i<=n;i++){for(int j=1;j<=i;j++){count++;} }這個是多少,仔細來看,n等于8,這個不搭理他,我們要的是找循環體,i小于等于n,i加加,j加加,j小于等于i,這個好奇怪,他的級別會是多少,這個要稍微繁瑣一下,你一定要想一下,這個for(int i=1;i<=n;i++)循環幾次,是不是n次,那里面的這個循環for(int j=1;j<=i;j++)循環了幾次,那是不確定的,因為i等于1就循環1次,i等于2,,從1到2,i等于3,從1到3,所以你可以這么算一下,怎么算啊,當i等于1的話,這條語句執行1次,因為你看,從1到1嘛,j小于等于i嘛,當i要是等于2的話,兩次,i等于3的時候,3次,再加上4等于1+2+3+4,當i要是等于n的時候,j從1到n,是不是就是n次,告訴我1+2+3+4+....+n=?,這是不是就是他的完整的執行次數,稍微復雜一下,這不就是剛才效率最高的算法嗎,1+2+3+...+n=(1+n)*n/2,這是多少啊,這是時間復雜度嗎,這是時間頻度,我們以更加簡單的形式來寫一下,0.5n2+0.5n,這是時間頻度,T(n)=0.5n2+0.5n,我求的是T(n)=O(n2),最后就剩n的平方 我們現在通過這么幾個例子,讓大家對時間復雜度入門,第一個知道有哪些級別,第二個他大概是怎么來算的,還要明確這個概念,后面我們講什么線性表啦,講樹啦,講查詢排序,往往都是去說他的時間復雜度,因為這是衡量他優劣的最直接的指標,你要明確常用的時間復雜度有多少? 我們列了一個表1. 常數階 O(1)2. 對數階 O(log2 n):你見到log2 n你就要想那個國際象棋,要米粒3. 線數階 O(n): 這個就和上面一個差別就很大了4. 線性對數階 O(n*log2 n)5. 平方階 O(n2): n的平方就是n乘以n, n大于log2 n6. 立方階 O(n3): 是不是復雜度效率更低........指數階 :效率更低,2的n次方階乘階: n的階乘 n!,誰能寫出這樣一個算法我佩服你,這個級別效率太低了,一般來說常用的復雜度,越往下時間復雜度越高,執行效率越低,我們以后編寫程序,盡量控制一下規模,你如果要來個三重的循環,那估計就是這個立方階 O(n3),我們這里又一個表當n等于8,等于10,等于1000的時候,什么意思,如果你的級別是O(n)的話,如果n等于1000,你就執行1000次,如果是O(log2 n),就是2的10次方,9次10次就可以了,9次和1000次的差別,如果O(1)一次就可以了,如果你的你別是O(n),執行此時是1億次,但是如果是log2 n的話是8次就夠了,8次和1億次是什么差別講到這里我們就把時間的復雜度給大家說完了再來看一下算法的空間復雜度,空間復雜度沒有什么過多要說的吧,更多的是來計算時間復雜度,空間復雜度用S(n)來表示為什么要用S來表示,S是什么意思,是Space空間,n是問題的規模,S(n)=O(g(n)),O是最壞的情況,他也代表復雜度,這里面還有一個函數,我們一起分析一下int fun(int n){int i,j,k,s;s=0;for(int i=0;i<=n;i++){for(int j=0;j<=i;j++){for(int k=0;k<=j;j++){s++;}}}return s; }告訴我這個空間復雜度是多少,n是多少,那不確定,n可能是個無窮大的數,他不確定,i,j,k,s,s等于0,開始循環了,就是這4個變量了,我們現在不是求時間復雜度,我們求的是空間復雜度,你覺得這段代碼要執行,內存里面要占多少空間,第一個變量是i,第二個變量是j,第三個變量是k,第四個變量是s,i是0,j是0,k是0,s是0,i要變成1,j要變成1,2,沒有分配額外的空間,這個i要變,k也要變,s也要變,只需要4個空間就夠了,因為你變來變去,并沒有分配額外的空間,我有4個空間就夠了,并沒有占別的空間,S(n)=4,4個空間就夠了,我要空間復雜度呢,S(n)=O(1),空間復雜度是1,因為n是100萬,他也是4個空間,什么情況下空間復雜度也會很高,n越大分的空間越多,比如說遞歸由于算法中臨時變量的個數與問題規模n無關,所以空間復雜度為S(n)=O(1),空間復雜度分析2:void fun(int a[],int n,int k){// 數組a共有n個元素int i;if(k==n-1){for(int i=0;i<n;i++){// 執行n次printf("%d\n",a[i]);}}else{for(int i=k;i<n;i++){// 執行n-k次a[i] = a[i] + i*i;fun(a,n,k+1);}}}fun(a,n,k+1)這個叫什么啊,這個叫遞歸,自己調自己叫遞歸,這個算法大家已經學過了,他要分多少空間,如果我們只是調用函數一次,這個函數如果調一次,不遞歸的話,需要3個,一個n,一個k,一個i,再加一個數組a,數量是有限制的,級別還是1,如果還往下這么調呢,它會調多少次,會遞歸往下調多少級別,如果他是n個級別的話,如果遞歸n次的話就是1*n,每次調用這個函數,比如棧的空間特別少,但是調n次,哪怕他調用n/2次呢,那這個n也是無窮數,所以我們求這個級別的話怎么求,還是O(n)的,每調函數一次,花的空間很少,此屬于遞歸算法,每次調用本身都需要分配空間,空間很少,但是你經不住他調的次數多,每遞歸一次都要分配一次空間,所以他的空間復雜度是O(n),那大家都記住一個結論,請問遞歸有什么缺點,效率低下,占用空間多,那我為什么還要用遞歸,代碼簡單,思路簡單,特別的方便,航天飛機里面一般不用遞歸,為什么,實時系統里面不用遞歸,實時反應,占的空間多,效率還低,可能計算結果要花很多的時間,但是他代碼簡單,性能要求不是特別高的情況下,可以用遞歸來實現,在我們后面的數據結構里面,使用最多的一個內容就是遞歸,很多地方樹的遍歷,圖的遍歷,折半查找,還有很多的查詢排序,都用到遞歸,下來對遞歸進行了大量的練習,因為遞歸是我們面試的時候用的比較多的內容,關于空間復雜度我們就簡單的說到這里記住:1. 空間復雜度比時間復雜度分析要少2. 用遞歸算法,代碼比較簡單,算法本身占的空間少,但是運行的時候要分配比較多的空間,寫的代碼少,但是運行是需要多次調用,占很多的空間,如果采用非遞歸算法呢,代碼可能會很長,代碼會是很復雜的代碼,代碼多了,存代碼就占的多了,運行的時候,就像我們剛剛畫的圖一樣,運行的時候就占的比較少

?

總結

以上是生活随笔為你收集整理的分析时间复杂度和空间复杂度(一级)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。