[英]Recurrence Relations: Proving (n/2) + (n/2) = O(n)
所以說我有一個像這樣的算法:
void dummy_algorithm(int a[]) {
int center = floor(a.length/2);
//For reference purposes: Loop 1
for(int i = 0; i < center; i++) {
//The best code you've ever seen
}
//Loop 2
for(int j = center + 1; j < a.length; j++) {
//Slightly less awesome code
}
}
這是非常基本的東西。 我知道兩個循環都遍歷數組的一半,因此每個循環的復雜度為(n / 2)。 但是,該方法的總工作量顯然為O(n)。
所以,我的問題是:如何證明(通過遞歸關系)該算法為O(n)? 還是我完全錯了?
注意:我無法將兩個循環合而為一。 它們執行最終將被遞歸調用的操作。 您無法想到的任何其他內容。 這個問題有很多限制。
如果您確實在尋找O(x)+ O(y)= O(x + y)的證明,那么可以遵循以下原則:
R1∈O(x)∧R2∈O(y)
⇒∃ R1 <軸b。 R2 <by
⇒∃a,b。 R1 <斧∧R2 <由
⇒∃a,b。 R1 + R2 <軸+通過
⇒∃a,b。 c = max(a,b)∧R1 + R2 <cx + cy
⇒∃c。 R1 + R2 <c(x + y)
⇒R1 + R2∈O(x + y)
(N/2) + (N/2)
= 2*(N/2)
= 2N/2
= N
時間復雜度(以及是否需要遞歸關系) 取決於您在循環中執行的操作 ,即
//The best code you've ever seen (*complexity1*)
和
//Slightly less awesome code (*complexity2*)
是。
如果每個迭代僅需要恆定的時間量 ,即O(1)中的complex1和complex2 ,則總復雜度將為n * O(1)= O(n)。 這說明什么大O表示法確實:抽象從持續性因素,如complexity1和complexity2了。
如果每次迭代都需要O(f(n)) ,那么您的總時間復雜度將為O(n * f(n))。
如果每次迭代都進行遞歸調用 ,即使用較小的參數調用dummy_algorithm
,則確實需要一個遞歸關系來計算時間復雜度。 遞歸關系的外觀取決於您進行遞歸調用的頻率和參數。 http://en.wikipedia.org/wiki/Recurrence_relation向您展示如何查找和解決適當的重復關系。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.