當前位置:首頁 » 自動清洗 » 怎樣計算最好最壞平均時間復雜度
擴展閱讀
蛀牙晚上痛是什麼原因 2025-05-12 07:56:09

怎樣計算最好最壞平均時間復雜度

發布時間: 2022-04-25 10:00:18

1. 怎麼判斷時間復雜度好與壞

當n趨於無窮大時,哪個趨向的越慢就越好,越快就越壞:
O(1) < O(logn) < O(n) < O(n^3),越往右越差,最左最好,是常量

2. 如何計算一個演算法的時間復雜度

你這個問題是自己想出來的吧?
第一,你指的時間復雜度是大o表示法的復雜度,也就是一個上界,但不是上確界,所以就算你以一種方式中斷排序過程,時間復雜度還是o(n*logn),假設排序過程還能執行的話。
第二,達到o(n*logn)的排序演算法,以快速排序為例,快速排序不知道你看過沒有,它不像選擇排序或者冒泡排序那樣,每一趟可以確定一直最大或者最小值,對於快速排序,每一趟排序後如果你刪掉最後一個元素將導致整個演算法失效。如果你要用這種刪除元素方法的話,只能採用冒泡排序或者選擇排序,時間復雜度是o(n^2)
所以,我猜想你是不是想做類似於在n個元素中尋找前k個最大者之類的事情(k=n-l)
如果是這樣的話,有復雜度是o(n*logk)的演算法,利用快速排序中的partition操作
經過partition後,pivot左邊的序列sa都大於pivot右邊的序列sb;
如果|sa|==k或者|sa|==k-1,則數組的前k個元素就是最大的前k個元素,演算法終止;
如果|sa|
k,則從sa中尋找前k大的元素。
一次partition(arr,begin,end)操作的復雜度為end-begin,也就是o(n),最壞情況下一次partition操作只找到第1大的那個元素,則需要進行k次partition操作,總的復雜度為o(n*k)。平均情況下每次partition都把序列均分兩半,需要logk次partition操作,總的復雜度為o(n*logk)。
由於k的上界是n,所以以n表示的總復雜度還是o(n*logn)

3. 數據結構中演算法的時間和空間復雜度怎麼計算

你好.T(n)=O( f (n) ) 表示時間問題規模n的增大,演算法執行時間的增長率和f(n)的增長率相同.稱作時間復雜度.如下:1.{++x;s=0}2.for (i=1;i<=n;++i) { ++x; s+=x;}3.for ( j=1; j<=n;++j ) for (k+1;j<=n;++k) { ++x;s+=x;}基本操作「x增1」的語句的頻度分別為1.n和n的平方.則這三個程序段的時間復雜度分別為.O(1). O(n)..O(n平方).分別為常量階.線性階.和平方階...演算法可能呈現的時間復雜度還有對數階O(long n).指數階O(2 n方)等.空間復雜度:s(n)=O(f(n))其中n為問題的規模(或大小).一個上機執行的程序除了需要存儲空間來寄存本身所用指令.常數.變數和輸入數據外.也要一些對數據進行操作的工作單元和存儲一些為實現計算所需信息的空間.若輸入數據所佔的空間只取決於問題本身,和演算法無關,則只要分析除輸入和程序之處的額處空間,否則應同時考慮輸入本身所需空間...有點抽象...因為本人也學不好.所以.只能回答這些..見諒..

4. 演算法的時間復雜度如何計算

關於時間復雜度的計算是按照運算次數來進行的,比如1題:
Sum1(
int
n
)
{
int
p=1,
sum=0,
m
;
//1次
for
(m=1;
m<=n;
m++)
//n+1次
{
p*=m
;
//n次
sum+=p
;
}
//n次
return
(sum)
;
//1次
}
最後總的次數為
1+(n+1)+n+n+1+1=3n+3
所以時間復雜度f(o)=n;(時間復雜度只管n的最高次方,不管他的系數和表達式中的常量)
其餘的一樣,不明白的可以來問我

5. 時間復雜度如何計算

一般不用最好情況,用的最多的是最壞情況,有時也用平均情況。例如,桶排序的最壞情況下時間復雜度是跟插入排序一樣的,但是平均情況要比插入好多了。

6. 如何計算時間復雜度

一般情況下,演算法的基本操作重復執行的次數是模塊n的某一個函數f(n)。

因此,演算法的時間復雜度記做:T(n)=O(f(n))。

隨著模塊n的增大,演算法執行的時間的增長率和f(n)的增長率成正比,所以f(n)越小,演算法的時間復雜度越低,演算法的效率越高。

在計算時間復雜度的時候,先找出演算法的基本操作,然後根據相應的各語句確定它的執行次數,再找出T(n)的同數量級(它的同數量級有以下:1,Log2n ,n ,nLog2n ,n的平方,n的三次方,2的n次方,n!),找出後,f(n)=該數量級,若T(n)/f(n)求極限可得到一常數c,則時間復雜度T(n)=O(f(n))。

7. 如何計算一個演算法的時間復雜度

求解演算法的時間復雜度的具體步驟是:

1、找出演算法中的基本語句:

演算法中執行次數最多的那條語句就是基本語句,通常是最內層循環的循環體。

2、計算基本語句的執行次數的數量級:

(1)只需計算基本語句執行次數的數量級,這就意味著只要保證基本語句執行次數的函數中的最高次冪正確即可,可以忽略所有低次冪和最高次冪的系數。

(2)這樣能夠簡化演算法分析,並且使注意力集中在最重要的一點上:增長率。

3、用大Ο記號表示演算法的時間性能:

(1)將基本語句執行次數的數量級放入大Ο記號中。

(2)如果演算法中包含嵌套的循環,則基本語句通常是最內層的循環體,如果演算法中包含並列的循環,則將並列循環的時間復雜度相加。例如:

for(i=1;i<=n;i++)x++;for(i=1;i<=n;i++)
for(j=1;j<=n;j++)x++;

(3)第一個for循環的時間復雜度為Ο(n),第二個for循環的時間復雜度為Ο(n2),則整個演算法的時間復雜度為Ο(n+n2)=Ο(n2)。

8. 演算法在最壞情況,最好情況和平均情況下的計算復雜性概念及對三者時間復雜性的分析

計算復雜性目前主要用計算所消耗的資源數量來量度。由於演算法在計算時所消耗的資源與問題規模有關,所以通常用遞增函數來估計。另外,對具體問題實例,演算法的資源消耗量是不同的,通常可以估計出最壞、最好和平均三種情形下對資源消耗的數量。對上述三者作時間復雜性分析的具體做法如下:以順序查找為例,最壞情況是指需要搜索完所有的數據;最好情況是指搜索的第一個數據就是所要的數據;平均情況是指所獲得的數據按其實際分布而言,平均需要查找比較的次數。

9. 如何計算時間復雜度

1、先找出演算法的基本操作,然後根據相應的各語句確定它的執行次數,再找出T(n)的同數量級(它的同數量級有以下:1,Log2n ,n ,nLog2n ,n的平方,n的三次方,2的n次方,n!),找出後,f(n)=該數量級,若T(n)/f(n)求極限可得到一常數c,則時間復雜度T(n)=O(f(n))。

2、舉例

for(i=1;i<=n;++i)

{for(j=1;j<=n;++j)

{c[ i ][ j ]=0; //該步驟屬於基本操作 執行次數:n的平方次

for(k=1;k<=n;++k)

c[ i ][ j ]+=a[ i ][ k ]*b[ k ][ j ]; //該步驟屬於基本操作 執行次數:n的三次方次}}

則有 T(n)= n的平方+n的三次方,根據上面括弧里的同數量級,我們可以確定 n的三次方為T(n)的同數量級

則有f(n)= n的三次方,然後根據T(n)/f(n)求極限可得到常數c

則該演算法的 時間復雜度:T(n)=O(n的三次方)

),線性階O(n),線性對數階O(nlog2n),平方階O(n^2),立方階O(n^3),...,

k次方階O(n^k),指數階O(2^n)。隨著問題規模n的不斷增大,上述時間復雜度不斷增大,演算法的執行效率越低。

關於對其的理解

《數據結構(C語言版)》 ------嚴蔚敏 吳偉民編著 第15頁有句話「整個演算法的執行時間與基本操作重復執行的次數成正比。」

基本操作重復執行的次數是問題規模n的某個函數f(n),於是演算法的時間量度可以記為:T(n) = O(f(n))

如果按照這么推斷,T(n)應該表示的是演算法的時間量度,也就是演算法執行的時間。

而該頁對「語句頻度」也有定義:指的是該語句重復執行的次數。

如果是基本操作所在語句重復執行的次數,那麼就該是f(n)。

上邊的n都表示的問題規模。

10. 快速排序的復雜度怎麼算,是多少

這個,我確實一點也不懂,幫你搜索。

1.
快速排序-時空復雜度:
快速排序每次將待排序數組分為兩個部分,在理想狀況下,每一次都將待排序數組劃分成等長兩個部分,則需要logn次劃分。
而在最壞情況下,即數組已經有序或大致有序的情況下,每次劃分只能減少一個元素,快速排序將不幸退化為冒泡排序,所以快速排序時間復雜度下界為O(nlogn),最壞情況為O(n^2)。在實際應用中,快速排序的平均時間復雜度為O(nlogn)。
快速排序在對序列的操作過程中只需花費常數級的空間。空間復雜度S(1)。
但需要注意遞歸棧上需要花費最少logn最多n的空間。

2.快速排序-隨機化演算法:
快速排序的實現需要消耗遞歸棧的空間,而大多數情況下都會通過使用系統遞歸棧來完成遞歸求解。在元素數量較大時,對系統棧的頻繁存取會影響到排序的效率。
一種常見的辦法是設置一個閾值,在每次遞歸求解中,如果元素總數不足這個閾值,則放棄快速排序,調用一個簡單的排序過程完成該子序列的排序。這樣的方法減少了對系統遞歸棧的頻繁存取,節省了時間的消費。
一般的經驗表明,閾值取一個較小的值,排序演算法採用選擇、插入等緊湊、簡潔的排序。一個可以參考的具體方案:閾值T=10,排序演算法用選擇排序。
閾值不要太大,否則省下的存取系統棧的時間,將會被簡單排序演算法較多的時間花費所抵消。
另一個可以參考的方法,是自行建棧模擬遞歸過程。但實際經驗表明,收效明顯不如設置閾值。

3.快速排序的最壞情況基於每次劃分對主元的選擇。基本的快速排序選取第一個元素作為主元。這樣在數組已經有序的情況下,每次劃分將得到最壞的結果。一種比較常見的優化方法是隨機化演算法,即隨機選取一個元素作為主元。這種情況下雖然最壞情況仍然是O(n^2),但最壞情況不再依賴於輸入數據,而是由於隨機函數取值不佳。實際上,隨機化快速排序得到理論最壞情況的可能性僅為1/(2^n)。所以隨機化快速排序可以對於絕大多數輸入數據達到O(nlogn)的期望時間復雜度。一位前輩做出了一個精闢的總結:「隨機化快速排序可以滿足一個人一輩子的人品需求。」
隨機化快速排序的唯一缺點在於,一旦輸入數據中有很多的相同數據,隨機化的效果將直接減弱。對於極限情況,即對於n個相同的數排序,隨機化快速排序的時間復雜度將毫無疑問的降低到O(n^2)。解決方法是用一種方法進行掃描,使沒有交換的情況下主元保留在原位置。

4.設要排序的數組是A[0]……A[N-1],首先任意選取一個數據(通常選用第一個數據)作為關鍵數據,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。一趟快速排序的演算法是:
1)設置兩個變數I、J,排序開始的時候:I=0,J=N-1;
2)以第一個數組元素作為關鍵數據,賦值給key,即 key=A[0];
3)從J開始向前搜索,即由後開始向前搜索(J=J-1),找到第一個小於key的值A[J],並與A[I]交換;
4)從I開始向後搜索,即由前開始向後搜索(I=I+1),找到第一個大於key的A[I],與A[J]交換;
5)重復第3、4、5步,直到 I=J; (3,4步是在程序中沒找到時候j=j-1,i=i+1。找到並交換的時候i, j指針位置不變。另外當i=j這過程一定正好是i+或j+完成的最後另循環結束)
例如:待排序的數組A的值分別是:(初始關鍵數據:X=49) 注意關鍵X永遠不變,永遠是和X進行比較,無論在什麼位子,最後的目的就是把X放在中間,小的放前面大的放後面。
A[0] 、 A[1]、 A[2]、 A[3]、 A[4]、 A[5]、 A[6]:
49 38 65 97 76 13 27
進行第一次交換後: 27 38 65 97 76 13 49
( 按照演算法的第三步從後面開始找)
進行第二次交換後: 27 38 49 97 76 13 65
( 按照演算法的第四步從前面開始找>X的值,65>49,兩者交換,此時:I=3 )
進行第三次交換後: 27 38 13 97 76 49 65
( 按照演算法的第五步將又一次執行演算法的第三步從後開始找
進行第四次交換後: 27 38 13 49 76 97 65
( 按照演算法的第四步從前面開始找大於X的值,97>49,兩者交換,此時:I=4,J=6 )
此時再執行第三步的時候就發現I=J,從而結束一趟快速排序,那麼經過一趟快速排序之後的結果是:27 38 13 49 76 97 65,即所以大於49的數全部在49的後面,所以小於49的數全部在49的前面。
快速排序就是遞歸調用此過程——在以49為中點分割這個數據序列,分別對前面一部分和後面一部分進行類似的快速排序,從而完成全部數據序列的快速排序,最