當前位置:首頁 » 操作系統 » 常數階的演算法

常數階的演算法

發布時間: 2023-05-28 04:08:09

1. 演算法時間復雜度有幾種

演算法時間復雜度有3種:

1、常數階O(1),對數階O(log2n)(以2為底n的對數,下同),線性階O(n),

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

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

(1)常數階的演算法擴展閱讀:

一般情況下,演算法中基本操作重復執行的次數是問題規模n的某個函數,用T(n)表示,若有某個輔助函數f(n),存在一個正常數c使得fn*c>=T(n)恆成立。記作T(n)=O(f(n)),稱O(f(n)) 為演算法的漸進時間復雜度,簡稱時間復雜度。

在各種不同演算法中,若演算法中語句執行次數為一個常數,則時間復雜度為O(1),另外,在時間頻度不相同時,時間復雜度有可能相同,如T(n)=n^2+3n+4與T(n)=4n^2+2n+1它們的頻度不同,但時間復雜度相同,都為O(n^2)。

2. 演算法時間復雜度怎麼算

一、概念
時間復雜度是總運算次數表達式中受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的值非常小,因為,在 這個問題中增加一個元素就導致運行時間加倍。不幸的是,確實有許多問題 (如著名的「巡迴售貨員問題」 ),到目前為止找到的演算法都是指數的。如果我們真的遇到這種情況,通常應該用尋找近似最佳結果的演算法替代之。

3. 一文講透演算法中的時間復雜度和空間復雜度計算方式

作為一名「程序猿」,大家應該都聽過這么一句話:程序=數據結構+演算法。

這句話是由瑞士計算機科學家尼古拉斯·沃斯(Niklaus Wirth)在 1984 年獲得圖靈獎時說的一句話,這位大佬還以這句話為名出了一本書《Algorithms + Data Structures=Programs》,從此這句話就成為了大家耳熟能詳的一句名言。

隨著時間的推移,不管這句話是不是非常准確,但至少能說明數據結構與演算法對程序來說是非常核心的基礎,如果我們想要寫出更多優秀優雅的代碼,那麼數據結構與演算法是必須要掌握好的。

很多人可能覺得,我不會演算法,代碼一樣寫得很"溜",演算法這東西似乎用處不大。現在互聯網的發達,我們想要什麼幾乎都可以在網上找到現成的,各種框架功能十分強大,似乎看起來確實不用演算法也可以寫出「好代碼」。然而假如我們不懂演算法,比如項目中用到了排序,我們如何評估代碼的執行效率?再比如最常用的 ArrayList 和 LinkedList ,我們該如何選擇,又比如說我們需要去集合中找某一個數,又該如何寫出性能優秀的代碼呢?

同樣的代碼,如何判斷誰的代碼是優秀的代碼?可讀性,可擴展性,健壯性可能都可以用來判定,然而這些東西我覺得並不能直接體現出你代碼的優秀,因為對用戶而言,訪問你的代碼響應速度快那就是優秀的代碼,相反,動輒響應幾秒甚至更長時間的介面,恐怕就算你可讀性再好,再健壯也稱不上是好代碼。

所以說一段代碼是否優秀,最直接的判斷標准就是性能,而如果要寫出高性能的代碼,那麼就必須要了解演算法,而且拋開這個因素,但凡不想一輩子都寫 CRUD 代碼的,也需要去了解演算法,我們使用的很多框架和中間件底層都有數據結構和演算法的身影,學好演算法對我們源碼閱讀時理解其設計思想也是大有裨益的。

要說功利性的目的,那就是面試,目前很多大廠的面試,演算法基本必面,所以想進大廠的話,咱們也得好好學學演算法。

提到演算法,很多人的第一反應就是太難學了,學不會,或者說經常是看完就忘了,但是其實對於我們一個普通的開發者而言,因為並不需要我們去發明演算法,我們需要的僅僅只是去靈活的運用演算法,所以並不需要非常扎實的數據基礎,當然基本的數學常識還是要有的。

如果說需要去發明設計一款演算法,那就要去推導去證明演算法的可行性,這種是需要具有非常扎實的數學基礎的,一般人確實無法做到,然而我們普通程序員口中提到演算法無非是二分查找法,哈希演算法等,高級一點的就還有回溯,貪心,動態規劃等等,這些所謂的演算法都是已經有現成的公式了,我們要做的無非就是理解它,然後靈活的運用它。這就和我們以前學習數學公式一樣,給你一個公式,然後你去做題,做題的過程其實就是去靈活地運用這個公式。

演算法也是同理,都是有特定方法和特定思路的,我們也並不需要去推導證明這種方式為什麼可行,所以學習演算法沒有其他訣竅,就是先理解思路,然後多練,等熟練了,自然就可以靈活運用了,也不會說學了立刻就忘了。學完就忘無非兩個原因,一是沒理解,二是沒有練習鞏固。

數據結構與演算法經常是放在一起講,這兩者是沒辦法獨立的,因為演算法是為了達到某種目的的一種實現方式,而數據結構是一種載體,也就是說演算法必須依賴數據結構這種載體,否則就是空談。換句話說:數據結構是為演算法服務的,而演算法又需要作用在特定的數據結構之上。

一個演算法到底好不好,我們如何去評價?前面我們提到了,你的代碼好不好,最直觀的就是看響應速度,演算法也一樣,同樣實現一個目的(比如說排序),誰的演算法速度快,我們就可以認為誰的演算法更優,如果說兩種演算法實現的速度差不多,那麼我們還可以去評價演算法所佔用的空間,誰佔用的空間少,那麼就可以認為誰的演算法更優,這就是演算法的基礎:時間復雜度和空間復雜度。

學習演算法之前,我們必須要學會如何分析時間復雜度和空間復雜度(也就是「快」和「省」),否則自己寫出來的演算法自己都不知道演算法的效率。

接觸過演算法的都知道,演算法的時間復雜度是用大寫的「O」來表示的,比如: O(1) , O(n) , O(logn) , O(nlogn) , O(n²) 等等。

變數指的是變數,也就是一段代碼的執行時間是隨著變數的變化而變化的,而不變指的是常量,也就是不論我的變數如何改變,執行時間都不會改變。

接下來我們就實際的來分析下常用時間復雜度的例子來練習一下。

0(1) 復雜度演算法也稱之為常數階演算法。這里的 1 是用來代指常量,也就是說這個演算法的效率是固定的,無論你的數據量如何變化,效率都一樣,這種復雜度也是最優的一種演算法。

上面的示例中不論有多少行代碼,時間復雜度都是屬於常數階段。換言之:只要代碼不存在 循環 遞歸 等循環類調用,不論代碼有多少行,其復雜度都是常數階。

O(n) 復雜度演算法也稱之為線性階段。比如下面這個示例我們應該怎麼分析復雜度呢?

前面常量階沒分析是因為常量階比較容易理解,接下來我們就以線性階這個為例子來分析下具體是怎麼得到的。

我們假設每一行代碼的執行時間是 T ,那麼上面這段代碼的執行復雜度是多少呢?

答案很明顯,那就是 T+n*T ,也就是 (n+1)T ,而在演算法中有一個原則,那就是常量可以被忽略,所以就得到了 nT ,換成大 O 表示法就是 O(n) 。

這只是一個簡略的計算過程,大家也不用較真說每行代碼執行時間可能不一樣之類的,也不要較真說 for 循環佔用了一行,下面的大括弧也佔用了一行,如果要較真這個,那我建議可以去想一下 1=1 為什麼等於 2 。

演算法中的復雜度反應的只是一個趨勢,這里 O(n) 反應的就是一個趨勢,也就是說隨著 n 的變化,演算法的執行時間是會降低的。

知道了上面的線性階,那麼平方階就很好理解了,雙層循環就是平方階,同理,三次循環就是立方階, k 次循環就是 k 次方階。

O(logn) 也稱之為對數階,對數階也很常見,像二分查找,二叉樹之類的問題中會見到比較多的對數階復雜度,但是對數階也是比較難理解的一種演算法復雜度。

下面我們還是來看一個例子:

這段代碼又該如何分析復雜度呢?這段代碼最關鍵的就是要分析出 while 循環中到底循環了多少次,我們觀察這個循環,發現 i 並不是逐一遞增,而是不斷地翻倍: 1->2->4->8->16->32->64 一直到等於 n 為什麼才會結束,所以我們得到了這樣的一個公式: 2^x=n 。

也就是說我們只要計算出 x 的值,就得到了循環次數,而根據高中的數學知識我們可以得到 x=log2n ( 2 在下面,是底數,試了幾種方法都打不出來,放棄了),所以根據上面線性階的分析方法,我們省略常量,就得到了示例中的演算法復雜度為 O(log2n) 。

同樣的分析方式,下面的例子,我們可以很快地分析出復雜度就為 O(log3n) :

上面得到的 log3n 我們可以再做進一步的轉換: log3n=log32 * log2n ,而 log32 (注意這幾個地方的情況 3 是底數,在下面) 是一個常量,常量可以省略,所以也就得到了: O(log3n)=O(log2n) 。同樣的道理,不論底數是多少,其實最終都可以轉化成和 O(log2n) 相等,正因為如此,為了方便,我們演算法中通常就會省略底數,直接寫作 O(logn) 。

上面的數學公式大家如果忘了或者看不懂也沒關系,只要記住不論對數的底數是多少,我們都算作 O(logn) ,而對於一個演算法的復雜度是否是對數階,還有一個簡易的判斷方法: 當循環中下標以指定倍數形式衰減,那麼這就是一個對數階

如果理解了上面的對數階,那麼這種線性對數階就非常好理解了,只需要在對數階的演算法中再嵌一層循環就是線性對數階:

分析了前面這些最常用的時間復雜度,其實我們可以得到以下規律:

除了上面常用的復雜度之外,另外還有指數階,階層階,根號階等,這些接觸的相對會較少,我們就不特意做分析了,如果大家感興趣的話,可以自己去了解下。

前面我們分析的都是只有一段代碼比較復雜的情況下得到的復雜度結果,那麼假如我一個演算法中,有多段代碼都比較復雜呢?這時候復雜度該如何分析?

我們先看下面這個例子:

這個例子中有三個循環,首先第一個,是一個常量,那麼根據前面的結論,不論這個常量是多大,都屬於常量級,所以第一個循環中的復雜度為 O(1) ,第二個和第三個循環我們前面也分析過,復雜度分別為 O(n) 和 O(n²) 。

也就是這一段代碼中有三段代碼產生了三種不同復雜度,而且這三個復雜度可以很明顯得到的大小關系為: O(1)<o(n)<o(n²) span=""> </o(n)<o(n²)> ,像這種在同一個演算法中有明確大小關系的,我們就可以直接取最大值作為這個演算法的復雜度,所以這個例子中演算法的復雜度就是 O(n²) 。

接下來我們再來看一個例子:

這個例子我們同樣對三段循環分別分析可以分別得到如下復雜度: O(1) , O(m) , O(n) 。這時候我們只能知道 O(1) 最小可以忽略,但是後面兩個無法卻無法確定大小,所以這時候我們需要取兩段循環復雜度之和來作為演算法的復雜度,所以可以得到這個例子的演算法復雜度為: O(m+n) 。

上面分析的時間復雜度都是比較簡單的,實際演算法中可能會比示例中復雜的多,而且我們示例中只要是循環都是無腦循環,也就是一定從頭循環到尾,然而實際中我們有時候並不需要從頭循環到尾,可能中途就會結束循環,所以我們根據實際情況,又可以將時間復雜度從以下四個方面來進一步分析:

這四種類型的時間復雜度在這里只會介紹前面三種,因為第四種比較復雜,而且使用場景也非常有限,而且對於這四種復雜度的分析,大家也作為了解就可以,不敢興趣的朋友們可以跳過這一小部分,因為在絕大部分情況我們只需要分析最壞復雜度就行,也就是假設循環全部執行完畢場景下的時間復雜度。

我們通過一個例子來理解下最好時間復雜度:

這個方法就是在一個指定數組中找到指定元素的下標,找不到就返回 -1 ,這個方法比較簡單,應該比較好理解。

注意這個方法中的循環體,如果找到元素,那麼就直接返回,這就會有一個現象,那就是我這個循環體到底會循環多少次是不確定的,可能是 1 次,也可能是 n (假設數組的長度) 次,所以假如我們要找的元素就在數組中的第一個位置,那麼我循環一次就找到了,這個演算法的復雜度就是 O(1) ,這就是最好情況時間復雜度。

理解了最好時間復雜度,那麼最壞時間復雜度也很好理解了,那就是數組中不存在我要找到元素,或者說最後一個值才是我要找的元素,那麼這樣我就必須循環完整個數組,那麼時間復雜度就是 O(n) ,這也就是最壞時間復雜度。

最好時間復雜度和最壞時間復雜度畢竟只有特殊情況才會發生,概率還是相對較小,所以我們很容易就想到我們也需要有一個平均時間復雜度。

我們簡單的來分析一下,為了便於分析,我們假設一個元素在數組和不在數組中的概率都為 1/2 ,然後假如在數組在,那麼又假設元素出現在每個位置的概率也是一樣的,也就是每個位置出現元素的概率為: 1/n 。

所以最終得到的平均時間復雜度應該等於元素在數組中和元素不在數組中兩種情況相加。

因為元素在數組中的概率為 1/2 ,然後在每個位置出現的概率也為 1/n 。假如元素出現在第一個位置,復雜度為 1*(1/2n) ;假如元素出現在第二個位置,復雜度為 2 * (1/2n) ,最終得到當前場景下時間復雜度為: 1*(1/2n) + 2 * (1/2n) + ... + n*(1/2n) =(n+1)/4。

前面已經假定了元素不在數組中的概率為 1/2 ,所以當前場景下的時間復雜度為: n * (1/2) ,因為元素不在數組中,那麼這個演算法必然會將整個循環執行完畢,也就循環是 n 次。

最後我們把兩種情況的復雜度之和相加就得到了平均時間復雜度: (n+1)/4 + n/2 = (3n+1)/4 ,最終我們將常數類的系數忽略掉,就得到了平均時間復雜度為 O(n) 。

均攤時間復雜度的演算法需要使用攤還分析法,計算方式相對有點復雜,而且使用場景很有限,本文就不做過多介紹了。

空間復雜度全稱就是漸進空間復雜度,用來表示演算法的存儲空間與數據規模之間的增長關系。和時間復雜度一樣,空間復雜度也是用大 O 進行表示。

其實學會了分析時間復雜度,那麼空間復雜度的分析就簡單了,主要就看我們在一個演算法當中到底有沒有使用到了額外的空間來進行存儲數據,然後判斷這個額外空間的大小會不會隨著 n 的變化而變化,從而得到空間復雜度。

我們來看一個給數組賦值例子,假設這就是一個演算法,我們可以來分析下這個演算法的空間復雜度:

一開始定義了一個變數,這里需要空間,但是這是一個常量級的(不隨 n 的變化而變化),然後再定義了一個數組,數組的長度為 n ,這里數組也需要佔用空間,而且數組的空間是隨著 n 的變化而變化的,其餘代碼沒有佔用額外空間,所以我們就可以認為上面示例中的空間復雜度為 O(n) 。

對於演算法的空間復雜度也可以簡單的進行總結一下:

本文主要講述了為什麼要學習演算法,也簡單減少了數據結構與演算法之間的關系,隨後主要介紹了演算法中的入門知識:時間復雜度和空間復雜度。想要學好演算法,必須要掌握如何分析一個演算法的時間復雜度和空間復雜度,只有自己會分析這兩個個衡量演算法主要性能的標准,才能更好的寫出性能優秀的演算法,同時我們也講到了最好時間復雜度,最壞時間復雜度,平均時間復雜度和均攤時間復雜度,不過這四種復雜度的計算方式大家作為了解即可,等實際確實需要使用到再來回顧也不遲。

4. 時間復雜度怎麼算

問題一:請問演算法的時間復雜度是怎麼計算出來的? 首先假設任意一個簡單運算的時間都是1,例如a=1;a++;a=a*b;這些運算的時間都是1.
那麼例如
for(int i=0;i 問題二:數據結構中的時間復雜度怎麼算啊?看不懂啊,有沒有具體的公式 求時間復雜度,其實是在統計基本操作步驟的執行次數。
「基本操作步驟」指的是加減乘除這種。比如有一個for循環,執行N次,每次做一個加法一個乘法,那麼總的操作步驟數就是2N,用大O記號就是O(N).
原理就是這么簡單,計數而已。
實際做題的時候,看清楚for循環的嵌套層數,就差不離。

問題三:如何計算演算法的時間復雜度 求解演算法的時間復雜度的具體步驟是:⑴找出演算法中的基本纖宏沖語句;演算法中執行次數最多的那條語句就是基本語句,通常是最內層循環的循環體。⑵計算基本語句的執行次數的數量級;只需計算基本語句執行次數的數量級,這就意味著只要保證基本語句執行次數的函數中的最高次冪正確即可,可以忽略所有低次冪和最高次冪的系數。這樣能夠簡化演算法分析,並且使注意力集中在最重要的一點上:增長率。⑶用大Ο記號表示演算法的時間性能。將基本語句執行次數的數量級放入大Ο記號中。如果演算法中包含嵌套的循環,則基本語句通常是最內層的循環體,如果演算法中包含並列的循環,則將並列循環的時間復雜度相加。例如:for(i=1;i 問題四:如何計算時間復雜度 如何計算時間復雜度
定義:如果一個問題的規模是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>

問題五:時間復雜度如何計算 10分 給我十分,我告訴你答案

問題六:C語言演算法的時間復雜度如何計算啊? 看看這個 每個循環都和上一層循環的參數有關。 所以要用地推公式: 設i(n)表示第一層循環的i為n時的循環次數,注意到他的下一層循環次數剛好就是n,分別是0,1,2...n-1 所以,把每一層循環設一個函數分別為:j(n),k(n),t(n) 則有 i(n)=j(0)+...+j(n-1) j(n)=k(0)+...+k(n-1) k(n)=t(0)+...+t(n-1) i(0)=j(0)=k(0)=0 t(n)=1 而總循環數是i(0)+i(1)...+i(n-1) 可以根據遞推條件得出准確值 所以演算法復雜度是O(i(0)+i(1)...+i(n-1))
記得採納啊

問題七:程序中的時間復雜度是怎麼計算的? 演算法復雜度的介紹,見網路:
ke./view/7527
時間復雜度
時間頻度
一個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機運行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且一個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多。一個演算法中的語句執行次數稱為語句頻度或時間頻度。記為T(n)。
計算方法
1. 一般情況下,演算法的基本操作重復執行的次數是模塊n的某一個函數f(n),因此,演算法的時間復雜度記做:T(n)=O(f(n))
分析:隨著模塊n的增大,演算法執行的時間的增長率和f(n)的增長率成正比,所以f(n)越小,演算法的時間復雜度越低,演算法的效率越高。
2. 在計算時間復雜度的時候,先找出演算法的基本操作,然後根據相應的各語句確定它的執行次數,再找出T(n)的同數量級(它的同數量級有以下:1,Log2n ,n ,nLog2n ,n的平方,n的三次方,2的n次方,n!),找出後,f(n)=該數量級,若T(n)/f(n)求極限可得到一常數c,則時間復雜度T(n)=O(f(n))
例:演算法:
for(i=1;i>

問題八:人臉識別的計算時間復雜度怎麼算 遞歸演算法的時間復雜度分析 收藏 在演算法分析中,當一個演算法中包含遞歸調用時,其時間復雜度的分析會轉化為一個遞歸方程求解。實際上,這個問題是數學上求解漸近階的問題,而遞歸方程的形式多種多樣,其求解方法也是不一而足,比較常用的有以下四種方法: (1)代入法(Substitution Method) 代入法的基本步驟是先推測遞歸方程的顯式解,然後用數學歸納法來驗證該解是否合理。 (2)迭代法(Iteration Method) 迭代法的基本步驟是迭代地展開遞歸方程的右端,使之成為一個非遞歸的和式,然後通過對和式的估計來達到對方程左端即方程的解的估計。 (3)套用公式法(Master Method) 這個方法針對形如「T(n) = aT(n/b) + f(n)」的遞歸方程。這種遞歸方程是分治法的時間復雜性所滿足的遞歸關系,即一個規模為n的問題被分成規模均為n/b的a個子問題,遞歸地求解這a個子問題,然後通過對這a個子間題的解的綜合,得到原問題的解。 (4)差分方程法(Difference Formula Method) 可以將某些遞歸方程看成差分方程,通過解差分方程的方法來解遞歸方程,然後對解作出漸近階估計。 下面就以上方法給出一些例子說明。 一、代入法 大整數乘法計算時間的遞歸方程為:T(n) = 4T(n/2) + O(n),其中T(1) = O(1),我們猜測一個解T(n) = O(n2 ),根據符號O的定義,對n>n0,有T(n) >

問題九:如何計算演算法的時間復雜度和空間復雜度 是說明一個程序根據其數據n的規模大小 所使用的大致時間和空間
說白了 就是表示 如果隨著n的增長 時間或空間會以什麼樣的方式進行增長

for(int i = 0; i

5. 時間復雜度怎麼算

時間復雜度是評估演算法運行時間效率的一個指標。在計算機科學中,常用大 O 表示法(Big O Notation)來描述時間復雜度。假設演算法中需要進行 n 次操作,並且每次操作的時間為 t,則該演算法的時間復雜度可以表示為 O(n*t)。

常見的演算法時間復雜度包括:

  • 常數階:O(1)。無論數據量大小,該演算法執行時間相同。

  • 線性階:O(n)。隨著數據量的增加,算散羨掘法執行的時間也會線性增長。

  • 對數階:O(logn)。演算法執行時間沖核隨著數據的增加而增長,但增長緩慢。

      在實際開發和分析中,需要評估演算法的時間復雜度,並根據數據情況選擇適當的演算法,以達到更好的運行效率。

6. 演算法 o(1)什麼意思

是常數階時間復雜度。
一般情況下,演算法的基本操作重復執行的次數是模塊n的某一個函數f(n),因此,演算法的時間復雜度記做:T(n)=O(f(n))按數量級遞增排列
常見的時間復雜度有:常數階O(1),對數階O(log2n),線性階O(n),線性對數階O(nlog2n),平方階O(n^2),立方階O(n^3),...,k次方階O(n^k),指數階O(2^n)。隨著問題規模n的不斷增大,上述時間復雜度不斷增大,演算法的執行效率越低。
(6)常數階的演算法擴展閱讀:
演算法(Algorithm)是指解題方案的准確而完整的描述,是一系列解決問題的清晰指令,演算法代表著用系統的方法描述解決問題的策略機制。也就是說,能夠對一定規范的輸入,在有限時間內獲得所要求的輸出。
如果一個演算法有缺陷,或不適合於某個問題,執行這個演算法將不會解決這個問題。不同的演算法可能用不同的時間、空間或效率來完成同樣的任務。一個演算法的優劣可以用空間復雜度與時間復雜度來衡量。
演算法中的指令描述的是一個計算,當其運行時能從一個初始狀態和(可能為空的)初始輸入開始,經過一系列有限而清晰定義的狀態,最終產生輸出並停止於一個終態。一個狀態到另一個狀態的轉移不一定是確定的。隨機化演算法在內的一些演算法,包含了一些隨機輸入。
參考資料來源:網路-演算法

7. 時間復雜度

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

⑴ 找出演算法中的基本語句;

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

⑵ 計算基本語句的執行次數的數量級;

只需計算基本語句執行次數的數量級,這就意味著只要保證基本語句執行次數的函數中的最高次冪正確即可,可以忽略所有低次冪和最高次冪的系數。這樣能夠簡化演算法分析,並且使注意力集中在最重要的一點上:增長率。

⑶ 用大Ο記號表示演算法的時間性能。
將基本語句執行次數的數量級放入大Ο記號中。
果演算法中包含嵌套的循環,則基本語句通常是最內層的循環體,如果演算法中包含並列的循環,則將並列循環的時間復雜度相加。例如:

第一個for循環的時間復雜度為Ο(n),第二個for循環的時間復雜度為Ο(n2),則整個演算法的時間復雜度為Ο(n+n2)=Ο(n2)。
Ο(1)表示基本語句的執行次數是一個常數,一般來說,只要演算法中不存在循環語句,其時間復雜度就是Ο(1)。

其中Ο(log2n)、Ο(n)、 Ο(nlog2n)、Ο(n2)和Ο(n3)稱為多項式時間,而Ο(2n)和Ο(n!)稱為指數時間。計算機科學家普遍認為前者(即多項式時間復雜度的演算法)是有效演算法,把這類問題稱為P(Polynomial,多項式)類問題,而把後者(即指數時間復雜度的演算法)稱為NP(Non-Deterministic Polynomial, 非確定多項式)問題。

一般來說多項式級的復雜度是可以接受的,很多問題都有多項式級的解——也就是說,這樣的問題,對於一個規模是n的輸入,在n^k的時間內得到結果,稱為P問題。有些問題要復雜些,沒有多項式時間的解,但是可以在多項式時間里驗證某個猜測是不是正確。

4)在計算演算法時間復雜度時有以下幾個簡單的程序分析法則:

(1).對於一些簡單的輸入輸出語句或賦值語句,近似認為需要O(1)時間

(2).對於順序結構,需要依次執行一系列語句所用的時間可採用大O下"求和法則"

求和法則:是指若演算法的2個部分時間復雜度分別為 T1(n)=O(f(n))和 T2(n)=O(g(n)),則 T1(n)+T2(n)=O(max(f(n), g(n)))

特別地,若T1(m)=O(f(m)), T2(n)=O(g(n)),則 T1(m)+T2(n)=O(f(m) + g(n))

(3).對於選擇結構,如if語句,它的主要時間耗費是在執行then字句或else字句所用的時間,需注意的是檢驗條件也需要O(1)時間

(4).對於循環結構,循環語句的運行時間主要體現在多次迭代中執行循環體以及檢驗循環條件的時間耗費,一般可用大O下"乘法法則"

乘法法則: 是指若演算法的2個部分時間復雜度分別為 T1(n)=O(f(n))和 T2(n)=O(g(n)),則 T1 T2=O(f(n) g(n))

(5).對於復雜的演算法,可以將它分成幾個容易估算的部分,然後利用求和法則和乘法法則技術整個演算法的時間復雜度

另外還有以下2個運演算法則:(1) 若g(n)=O(f(n)),則O(f(n))+ O(g(n))= O(f(n));(2) O(Cf(n)) = O(f(n)),其中C是一個正常數

簡單的說 就是可以將兩個演算法的時間復雜度 相加或相乘

(1)、O(1)

以上三條單個語句的頻度均為1,該程序段的執行時間是一個與問題規模n無關的常數。演算法的時間復雜度為常數階,記作T(n)=O(1)。注意:如果演算法的執行時間不隨著問題規模n的增加而增長,即使演算法中有上千條語句,其執行時間也不過是一個較大的常數。此類演算法的時間復雜度是O(1)。

(2)、O(n2)

2.1. 交換i和j的內容

解:因為Θ(2n2+n+1)=n2(Θ即:去低階項,去掉常數項,去掉高階項的常參得到),所以T(n)= =O(n2);

去低階項,去掉常數項,去掉高階項的常參得到
該演算法的時間復雜度T(n)=O(n^2).

(3)、O(n)

T(n)=2+n+3(n-1)=4n-1=O(n).
該演算法程序的時間復雜度為 O(n)

後續更新

8. 演算法時間復雜度o(1)和o(2)的區別

根據大O定義易知,O(1) = O(2)。用O(1)和O(2)表示同一個函數時,差別僅在於常數因子c而已。

兩個都是時間復雜度為常量。復雜度是用來表達演算法的復雜程度跟演算法輸入的規模N的關系。如果不管N是多大,演算法的復雜程度都固定是1或者2(比如1條指令,2個循環),那麼在「復雜度」這個概念上,兩者都一樣,叫做「常數階」復雜度。

O(g(n)) = { f(n) :存在這樣的正常數c和n0,使得對任意的n >= n0, 有0 <= f(n) <= cg(n)成立},則g(n)是f(n)的漸進上界。O(g(n))是指所有與g(n)具有相同增長率或比其增長率小的函數的集合。

(8)常數階的演算法擴展閱讀:

常見的時間復雜度:

按數量級遞增排列,常見的時間復雜度有:

常數階O(1);對數階復雜度,即O(log2n),比如有序數組的二分查找;線性階O(n),比如鏈式表的隨機訪問;線性對數階O(nlogn),比如某些排序演算法;平方階O(n^2),立方階O(n^3)等等。有些演算法特別復雜,復雜度可能是O(n!),O(n^n)等等。

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

參考資料來源:網路--時間復雜度

9. 演算法的 常數階,線性階,對數階 就是 什麼時候有 區別

當重復執行的次數,就是問題的規模很大的時候就有很大區別了.
最好的演算法就是常數階的.無論問題規模多大執行時間不變.
對數階就是 log a N .執行時間隨執行次數呈對數增長
線性階的次之.執行時間隨問題規模增長呈正比例增長

熱點內容
scratch少兒編程課程 發布:2025-04-16 17:11:44 瀏覽:640
榮耀x10從哪裡設置密碼 發布:2025-04-16 17:11:43 瀏覽:368
java從入門到精通視頻 發布:2025-04-16 17:11:43 瀏覽:86
php微信介面教程 發布:2025-04-16 17:07:30 瀏覽:310
android實現陰影 發布:2025-04-16 16:50:08 瀏覽:794
粉筆直播課緩存 發布:2025-04-16 16:31:21 瀏覽:346
機頂盒都有什麼配置 發布:2025-04-16 16:24:37 瀏覽:213
編寫手游反編譯都需要學習什麼 發布:2025-04-16 16:19:36 瀏覽:816
proteus編譯文件位置 發布:2025-04-16 16:18:44 瀏覽:367
土壓縮的本質 發布:2025-04-16 16:13:21 瀏覽:594