簡體   English   中英

遞歸關系:證明(n / 2)+(n / 2)= O(n)

[英]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)中的complex1complex2 ,則總復雜度將為n * O(1)= O(n)。 這說明什么大O表示法確實:抽象從持續性因素,如complexity1complexity2了。

如果每次迭代都需要O(f(n)) ,那么您的總時間復雜度將為O(n * f(n))。

如果每次迭代都進行遞歸調用 ,即使用較小的參數調用dummy_algorithm ,則確實需要一個遞歸關系來計算時間復雜度。 遞歸關系的外觀取決於您進行遞歸調用的頻率和參數。 http://en.wikipedia.org/wiki/Recurrence_relation向您展示如何查找和解決適當的重復關系。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM