算法

2015-05-29 33 views
1

的時間複雜度,我此刻的學習算法,並寫了下面的代碼,如果在一個維數組存在一個峯值,其發現。我的問題是我如何知道它的最佳情況或平均情況的時間複雜度?算法

最壞情況下的時間複雜度(如果數組元素被排序)是O(n),但是如果數組沒有排序並且它有10個元素,代碼會運行5個循環來獲得結果,的數組大小,所以任何人都可以告訴我如何用算法表示法來編寫它。

int[] arr = { 1,5,2,7,8,9,4,6,7}; 
int peak; 

int count = 0; 
for (int i = 1; i < arr.Length - 1; i++) 
{ 
      peak = -1; 
      if (arr[i - 1] <= arr[i] && arr[i] >= arr[i + 1]) 
      { 
       peak = arr[i]; 
       i++; 
      } 
      else if (arr[i - 1] >= arr[i] && i - 1 == 0) 
      { 
       peak = arr[i - 1]; 
      } 
      else if (arr[i + 1] >= arr[i] && i + 1 == arr.Length - 1) 
      { 
       peak = arr[i + 1]; 
      } 

      if (peak != -1) 
       listBox1.Items.Add(peak.ToString()); 

      count++; 
} 

listBox1.Items.Add(count.ToString()); 
+2

我想爲O(n)仍然是真實的,即使你的排序情況N/2上運行。大哦不關心常量。不是絕對的時間;只有親戚。 – duffymo

+0

如果有10個元素且數組未被排序,則不能說這個算法將運行5個循環。它可以未排序並運行7個循環或3個循環。 – MannfromReno

+0

謝謝,但它是我沒有排序的情況下運行n/2。 –

回答

3

你仍然把它寫成O(n)因爲大O是最壞的情況下(在這裏是線性時間。)在這種情況下n當然是數組的長度。理論上你的循環內沒有任何東西超過O(1)(我將忽略列表附加並將其稱爲常量)。

在注意到您對n/2迭代的意見後。 n/2是等於說(1/2)nO((1/2)n),因爲我們做的與大O邊界時忽略所有係數這相當於O(n)

+1

Big-O不是最壞的情況,它是攤銷成本。如果在最壞的情況下HashSet和Dictionary查找將被視爲'O(n)'而不是'O(1)' –

+0

@ScottChamberlain在他的例子中,沒有比'O(1)'查找更糟的了。唯一需要擔心的是列表附加了哪個列表,並且不清楚列表類型是什麼,最壞的情況是'O(n)',所以如果我們想真正獲得技術,我們可以認爲運行時實際上是'O(n) n^2)'或可能'O(nlogn)',但在大多數情況下,爲了簡單起見,我們將在該循環中調用O(1)中的所有內容。 –

+0

'k.ToString()'是爲O(log K),因爲它產生具有爲O(log K)的數字串。因此,假設數組包含與數組大小相似的數字,則在最壞的情況下,如果未排序,則代碼爲O(n log n)。 –