13

Tôi cố gắng xác định thời gian chạy cho thuật toán sau trong ký hiệu O. Đoán đầu tiên của tôi là O (n), nhưng khoảng cách giữa các lần lặp lại và số tôi áp dụng không ổn định. Làm thế nào tôi đã xác định không chính xác điều này?Giải quyết: T (n) = T (n/2) + n/2 + 1

public int function (int n) 
{ 
    if (n == 0) { 
    return 0; 
    } 

    int i = 1; 
    int j = n ; 
    while (i < j) 
    { 
    i = i + 1; 
    j = j - 1; 
    } 
    return function (i - 1) + 1; 
} 
+2

Để được chính xác, bit-O là cận trên, vì vậy có rất nhiều câu trả lời có thể. Ví dụ nó là đúng, nhưng thay vì gây hiểu lầm, để nói rằng thuật toán này là O (n * n). Khi có thể, tốt hơn là sử dụng big-Theta để báo hiệu thời gian chạy. Phân tích trong câu trả lời được chấp nhận có giá trị ngang nhau đối với big-Theta. –

Trả lời

29

while được thực hiện trong khoảng thời gian n/2.

Các đệ quy được thực hiện thông qua như n một giá trị đó là khoảng một nửa số bản gốc n, vì vậy:

n/2 (first iteration) 
n/4 (second iteration, equal to (n/2)/2) 
n/8 
n/16 
n/32 
... 

này tương tự như một geometric serie.

Infact nó có thể được biểu diễn dưới dạng

n * (1/2 + 1/4 + 1/8 + 1/16 + ...) 

Vì vậy, khi hội tụ tới n * 1 = n

Vì vậy, các ký hiệu O là O (n)

5

Một cách khác là để viết nó xuống như T(n) = T(n/2) + n/2 + 1 .
Vòng lặp while n/2 hoạt động. Đối số được chuyển đến cuộc gọi tiếp theo là n/2.

Giải quyết này bằng cách sử dụng master theorem nơi:

  • a = 1
  • b = 2
  • f = n/2 + 1

enter image description here

enter image description here

Let c=0.9 
1*(f(n/2) + 1) <? c*f(n) 
1*(n/4)+1 <? 0.9*(n/2 + 1) 
0.25n + 1 <? 0.45n + 0.9 
    0 < 0.2n - 0.1 

enter image description here

Đó là:

T(n) = Θ(n) 
Các vấn đề liên quan