1. 演算法的時間復雜度是指什麼
演算法的時間復雜度是指:執行程序所需的時間。
一般情況下,演算法中基本操作重復執行的次數是問題規模n的某個函數,用T(n)表示,若有某個輔助函數f(n),使得當n趨近無窮大時。
T(n)/f(n)的極限值為不等於零的常數,則稱為f(n)是T(n)的同數量級函數。記作T(n)=O(f(n)),稱O(f(n))為演算法的漸進時間復雜度,簡稱時間復雜度。比如:
在 T(n)=4nn-2n+2 中,就有f(n)=nn,使得T(n)/f(n)的極限值為4,那麼O(f(n)),也就是時間復雜度為O(n*n)。
時間復雜度中大O階推導是:
推導大O階就是將演算法的所有步驟轉換為代數項,然後排除不會對問題的整體復雜度產生較大影響的較低階常數和系數。
有條理的說,推導大O階,按照下面的三個規則來推導,得到的結果就是大O表示法:運行時間中所有的加減法常數用常數1代替。只保留最高階項去除最高項常數。
其他常見復雜度是:
f(n)=nlogn時,時間復雜度為O(nlogn),可以稱為nlogn階。
f(n)=n³時,時間復雜度為O(n³),可以稱為立方階。
f(n)=2ⁿ時,時間復雜度為O(2ⁿ),可以稱為指數階。
f(n)=n!時,時間復雜度為O(n!),可以稱為階乘階。
f(n)=(√n時,時間復雜度為O(√n),可以稱為平方根階。
2. 演算法時間復雜度指的是什麼
時間復雜性,又稱時間復雜度,演算法的時間復雜度是一個函數,它定性描述該演算法的運行時間。這是一個代表演算法輸入值的字元串的長度的函數。時間復雜度常用大O符號表述,不包括這個函數的低階項和首項系數。使用這種方式時,時間復雜度可被稱為是漸進的,亦即考察輸入值大小趨近無窮時的情況。
空間復雜性介紹
空間復雜性是指計算所需的存儲單元數量。隸屬於計算復雜性(計算復雜性由空間復雜性和時間復雜性兩部分組成)。演算法的復雜性是演算法運行所需要的計算機資源的量,需要時間資源量稱為時間復雜性,需要空間資源的量成為空間復雜性。
一個演算法的空間復雜度S(n)定義為該演算法所耗費的存儲空間,它也是問題規模n的函數。漸近空間復雜度也常常簡稱為空間復雜度。演算法的時間復雜度和空間復雜度合稱為演算法的復雜度。
3. 演算法的時間復雜度取決於什麼
演算法的時間復雜度取決於問題的規模,待處理數據的初態。
一個語句的頻度是指該語句在演算法中被重復執行的次數。演算法中所有語句的頻度之和記為T(n),它是該演算法問題規模n的函數,時間復雜度主要分析T(n)的數量級。演算法中基本運算(最深層循環內的語句)的頻度與Tn)同數量級,因此通常採用演算法中基本運算的頻度fn)來分析演算法的時間復雜度3。
演算法的時間復雜度記為:T(n)= O(fn))式中,О 的含義是T(n)的數量級,其嚴格的數學定義是:若T(n)和fn)是定義在正整數集合上的兩個函數,則存在正常數C和n,使得當n≥no時,都滿足0≤T(n)≤Cfn)。
演算法的時間復雜度不僅依賴於問題的規模n,也取決於待輸入數據的性質(如輸入數據元素的初始狀態)。
4. 時間復雜度的定義
在計算機科學中,演算法的時間復雜度是一個函數,它定量描述了該演算法的運行時間。這是一個關於代表演算法輸入值的字元串的長度的函數。時間復雜度常用大O符號表述,不包括這個函數的低階項和首項系數。
5. 演算法的時間復雜度定義
一、概念
時間復雜度是總運算次數表達式中受n的變化影響最大的那一項(不含系數)
比如:一般總運算次數表達式類似於這樣:
a*2^n+b*n^3+c*n^2+d*n*lg(n)+e*n+f
a ! =0時,時間復雜度就是O(2^n);
a=0,b<>0 =>O(n^3);
a,b=0,c<>0 =>O(n^2)依此類推
eg:
(1) for(i=1;i<=n;i++) //循環了n*n次,當然是O(n^2)
for(j=1;j<=n;j++)
s++;
(2) for(i=1;i<=n;i++)//循環了(n+n-1+n-2+...+1)≈(n^2)/2,因為時間復雜度是不考慮系數的,所以也是O(n^2)
for(j=i;j<=n;j++)
s++;
(3) for(i=1;i<=n;i++)//循環了(1+2+3+...+n)≈(n^2)/2,當然也是O(n^2)
for(j=1;j<=i;j++)
s++;
(4) i=1;k=0;
while(i<=n-1){
k+=10*i; i++; }//循環了n-1≈n次,所以是O(n)(5) for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
for(k=1;k<=j;k++)
x=x+1;
//循環了(1^2+2^2+3^2+...+n^2)=n(n+1)(2n+1)/6(這個公式要記住哦)≈(n^3)/3,不考慮系數,自然是O(n^3)
另外,在時間復雜度中,log(2,n)(以2為底)與lg(n)(以10為底)是等價的,因為對數換底公式:
log(a,b)=log(c,b)/log(c,a)
所以,log(2,n)=log(2,10)*lg(n),忽略掉系數,二者當然是等價的
二、計算方法1.一個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機運行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且一個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多。
一個演算法中的語句執行次數稱為語句頻度或時間頻度。記為T(n)。
2.一般情況下,演算法的基本操作重復執行的次數是模塊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))。
3.常見的時間復雜度
按數量級遞增排列,常見的時間復雜度有:
常數階O(1), 對數階O(log2n), 線性階O(n), 線性對數階O(nlog2n), 平方階O(n^2), 立方階O(n^3),..., k次方階O(n^k), 指數階O(2^n) 。
其中,1.O(n),O(n^2), 立方階O(n^3),..., k次方階O(n^k) 為多項式階時間復雜度,分別稱為一階時間復雜度,二階時間復雜度。。。。2.O(2^n),指數階時間復雜度,該種不實用3.對數階O(log2n), 線性對數階O(nlog2n),除了常數階以外,該種效率最高
例:演算法:
for(i=1;i<=n;++i)
{
for(j=1;j<=n;++j)
{
c[ i ][ j ]=0; //該步驟屬於基本操作 執行次數:n^2
for(k=1;k<=n;++k)
c[ i ][ j ]+=a[ i ][ k ]*b[ k ][ j ]; //該步驟屬於基本操作 執行次數:n^3
}
}
則有 T(n)= n^2+n^3,根據上面括弧里的同數量級,我們可以確定 n^3為T(n)的同數量級
則有f(n)= n^3,然後根據T(n)/f(n)求極限可得到常數c
則該演算法的 時間復雜度:T(n)=O(n^3)
四、
定義:如果一個問題的規模是n,解這一問題的某一演算法所需要的時間為T(n),它是n的某一函數
T(n)稱為這一演算法的「時間復雜性」。
當輸入量n逐漸加大時,時間復雜性的極限情形稱為演算法的「漸近時間復雜性」。
我們常用大O表示法表示時間復雜性,注意它是某一個演算法的時間復雜性。大O表示只是說有上界,由定義如果f(n)=O(n),那顯然成立f(n)=O(n^2),它給你一個上界,但並不是上確界,但人們在表示的時候一般都習慣表示前者。
此外,一個問題本身也有它的復雜性,如果某個演算法的復雜性到達了這個問題復雜性的下界,那就稱這樣的演算法是最佳演算法。
「大O記法」:在這種描述中使用的基本參數是
n,即問題實例的規模,把復雜性或運行時間表達為n的函數。這里的「O」表示量級 (order),比如說「二分檢索是 O(logn)的」,也就是說它需要「通過logn量級的步驟去檢索一個規模為n的數組」記法 O ( f(n) )表示當 n增大時,運行時間至多將以正比於 f(n)的速度增長。
這種漸進估計對演算法的理論分析和大致比較是非常有價值的,但在實踐中細節也可能造成差異。例如,一個低附加代價的O(n2)演算法在n較小的情況下可能比一個高附加代價的 O(nlogn)演算法運行得更快。當然,隨著n足夠大以後,具有較慢上升函數的演算法必然工作得更快。
O(1)
Temp=i;i=j;j=temp;
以上三條單個語句的頻度均為1,該程序段的執行時間是一個與問題規模n無關的常數。演算法的時間復雜度為常數階,記作T(n)=O(1)。如果演算法的執行時間不隨著問題規模n的增加而增長,即使演算法中有上千條語句,其執行時間也不過是一個較大的常數。此類演算法的時間復雜度是O(1)。
O(n^2)
2.1.
交換i和j的內容
sum=0;(一次)
for(i=1;i<=n;i++)(n次 )
for(j=1;j<=n;j++)
(n^2次 )
sum++;(n^2次 )
解:T(n)=2n^2+n+1 =O(n^2)
2.2.
for (i=1;i<n;i++)
{
y=y+1;①
for
(j=0;j<=(2*n);j++)
x++;②
}
解:
語句1的頻度是n-1
語句2的頻度是(n-1)*(2n+1)=2n^2-n-1
f(n)=2n^2-n-1+(n-1)=2n^2-2
該程序的時間復雜度T(n)=O(n^2).
O(n)
2.3.
a=0;
b=1;①
for
(i=1;i<=n;i++) ②
{
s=a+b;③
b=a;④
a=s;⑤
}
解:語句1的頻度:2,
語句2的頻度:
n,
語句3的頻度: n-1,
語句4的頻度:n-1,
語句5的頻度:n-1,
T(n)=2+n+3(n-1)=4n-1=O(n).
O(log2n
)
2.4.
i=1;①
while (i<=n)
i=i*2; ②
解: 語句1的頻度是1,
設語句2的頻度是f(n),則:2^f(n)<=n;f(n)<=log2n
取最大值f(n)=
log2n,
T(n)=O(log2n )
O(n^3)
2.5.
for(i=0;i<n;i++)
{
for(j=0;j<i;j++)
{
for(k=0;k<j;k++)
x=x+2;
}
}
解:當i=m,
j=k的時候,內層循環的次數為k當i=m時, j 可以取 0,1,...,m-1 , 所以這里最內循環共進行了0+1+...+m-1=(m-1)m/2次所以,i從0取到n, 則循環共進行了: 0+(1-1)*1/2+...+(n-1)n/2=n(n+1)(n-1)/6所以時間復雜度為O(n^3).
我們還應該區分演算法的最壞情況的行為和期望行為。如快速排序的最
壞情況運行時間是 O(n^2),但期望時間是 O(nlogn)。通過每次都仔細 地選擇基準值,我們有可能把平方情況 (即O(n^2)情況)的概率減小到幾乎等於 0。在實際中,精心實現的快速排序一般都能以 (O(nlogn)時間運行。
下面是一些常用的記法:
訪問數組中的元素是常數時間操作,或說O(1)操作。一個演算法如 果能在每個步驟去掉一半數據元素,如二分檢索,通常它就取 O(logn)時間。用strcmp比較兩個具有n個字元的串需要O(n)時間。常規的矩陣乘演算法是O(n^3),因為算出每個元素都需要將n對
元素相乘並加到一起,所有元素的個數是n^2。
指數時間演算法通常來源於需要求出所有可能結果。例如,n個元 素的集合共有2n個子集,所以要求出所有子集的演算法將是O(2n)的。指數演算法一般說來是太復雜了,除非n的值非常小,因為,在 這個問題中增加一個元素就導致運行時間加倍。不幸的是,確實有許多問題 (如著名的「巡迴售貨員問題」 ),到目前為止找到的演算法都是指數的。如果我們真的遇到這種情況,通常應該用尋找近似最佳結果的演算法替代之。
6. 演算法的時間復雜度是指什麼
就是對演算法執行時所花時間的度量。一般為問題規模的函數。
計算機科學中,演算法的時間復雜度是一個函數,它定量描述了該演算法的運行時間。這是一個關於代表演算法輸入值的字元串的長度的函數。時間復雜度常用大O符號表述,不包括這個函數的低階項和首項系數。使用這種方式時,時間復雜度可被稱為是漸近的,它考察當輸入值大小趨近無窮時的情況。
演算法復雜度分為時間復雜度和空間復雜度。其作用: 時間復雜度是指執行演算法所需要的計算工作量;而空間復雜度是指執行這個演算法所需要的內存空間。演算法的復雜性體現在運行該演算法時的計算機所需資源的多少上,計算機資源最重要的是時間和空間資源,因此復雜度分為時間和空間復雜度。
相關內容解釋:
函數在數學上的定義:給定一個非空的數集A,對A施加對應法則f,記作f(A),得到另一數集B,也就是B=f(A)。那麼這個關系式就叫函數關系式,簡稱函數。
簡單來講,對於兩個變數x和y,如果每給定x的一個值,y都有唯一一個確定的值與其對應,那麼我們就說y是x的函數。其中,x叫做自變數,y叫做因變數。
7. 什麼是演算法的時間復雜度
時間復雜度表面的意思就是代碼花費的時間,但是一般使用這個概念的時候,更注重的是隨著數據量增長,代碼執行時間的增長情況。一般認為一個基本的運算為一次運行算,例如加減乘除判斷等等
例1和例2時間復雜度都可以簡單認為是o(N),一般用時間復雜度的時候要取一個下限即可,不用那麼精確,可能你認為例1是o(2N)而例2是o(n),但實際上這兩者對於時間復雜度的作用來說沒區別,前面已經說了,時間復雜度關注的是數據量的增長導致的時間增長情況,o(2N)和o(n)在數據量增加一倍的時候,時間開銷都是增加一倍(線性增長)。
又例如兩重循環的時間復雜度是o(N的平方),N擴大一倍,時間復雜度就擴大4倍。所以時間復雜度主要是研究增長的問題,一般效率較好的演算法要控制在o(N)或者o(log2N)
8. 什麼是時間復雜度、空間復雜度
1、時間復雜度:是指一個演算法中的語句執行次數。
演算法分析的目的在於選擇合適演算法和改進演算法。
2、空間復雜度:是對一個演算法在運行過程中臨時佔用存儲空間的度量。
一個演算法在計算機存儲器上所佔用的存儲空間包括存儲演算法本身所佔用的空間,算數和輸入輸出所佔用的存儲空間以及臨時佔用存儲空間三個部分。
(8)演算法的時間復雜度的定義擴展閱讀:
在一個演算法中,時間復雜度和空間復雜度往往是相互影響的。當追求一個較好的時間復雜度時,可能會使空間復雜度的性能變差,即可能導致佔用較多的存儲空間;
反之,當追求一個較好的空間復雜度時,可能會使時間復雜度的性能變差,即可能導致佔用較長的運行時間。
另外,演算法的所有性能之間都存在著或多或少的相互影響。因此,當設計一個演算法(特別是大型演算法)時,要綜合考慮演算法的各項性能,演算法的使用頻率,演算法處理的數據量的大小,演算法描述語言的特性,演算法運行的機器系統環境等各方面因素,才能夠設計出比較好的演算法。
演算法的時間復雜度和空間復雜度合稱為演算法的復雜度
9. 演算法的時間復雜度是指什麼具體點
演算法復雜度不是簡單的時間的度量
是用來評價演算法優劣程度的依據
比如,一個程序要掃描100 * n * n + 10000 * n + 99999遍,那麼時間復雜度是O(n^2)
也就是說,時間復雜度只取次數最高的項,並且忽略系數
所以,時間復雜度是用來描述隨著 n 的增大,演算法耗時「增大」的!不是用來描述運行所花時間的(這個我們初中老師給我們強調了半天)
還有一點,O(9999999999)(實際應寫為O(1),這里只是表達意思)和O(n)的演算法那個好?
答案是O(9999999999),因為他的耗時不隨n的增大而變化,所以他更優
一般來說,演算法的好壞是這樣的 (>表示好於) O(1) > O(logn) > O(n) > O(n logn) > O(n^2) > O(n^3) > O(2^n) > O(n!)