2012-01-17 71 views
6

Độ phức tạp được đưa ra cho vấn đề sau là O (n). Không phải là O (n^2)? Đó là bởi vì vòng lặp bên ngoài là O (n) và bên trong cũng là O (n), do đó n * n = O (n^2)?Độ phức tạp của thuật toán

Bảng câu trả lời của câu hỏi này cho biết câu trả lời là O (n). Làm thế nào là có thể?

public static void q1d(int n) { 
    int count = 0; 
    for (int i = 0; i < n; i++) { 
     count++; 
     for (int j = 0; j < n; j++) { 
      count++; 
     } 
    } 
} 

Sự phức tạp của vấn đề sau là O (n^2), bạn có thể đạt được điều đó như thế nào? Ai đó có thể vui lòng xây dựng?

public static void q1E(int n) { 
    int count = 0; 
    for (int i = 0; i < n; i++) { 
     count++; 
     for (int j = 0; j < n/2; j++) { 
      count++; 
     } 
    } 
} 

Cảm ơn

+0

Tôi nghĩ phần trên là O (n^2) và bạn nghi ngờ gì về thứ hai? – WordsWorth

+0

Điều này có nghĩa là câu trả lời được cung cấp bởi giáo sư của tôi là không đúng hmm. – Harminder

+2

có vẻ như tờ trả lời có lỗi. – Zohaib

Trả lời

6

Sự phức tạp của cả hai mã là O (n * n)

FIRST

Các vòng ngoài chạy n lần và vòng lặp bên trong dao động từ 0 to n-1 lần

so

total = 1 + 2 + 3 + 4 ... + n

mà nếu bạn thêm arithmetic progressionn * (n + 1)/2O(n*n)

THỨ HAI

Các vòng ngoài chạy n lần và vòng lặp bên trong dao động từ 0 to n-1/2 lần

nên

total = 1 + 1/2 + 3/2 + 4/2 ... + n/2

mà nếu bạn thêm các cấp số cộng là n * (n + 1)/4 cũng là O(n*n)

+0

Vì vậy, nếu n/2 hiện nó vẫn bằng o (n)? Nhưng sự lặp lại cho vòng lặp bên trong là một nửa vòng lặp ngoài thực hiện bất kỳ sự khác biệt nào? – Harminder

+1

@ user1085135: 'O (n)' có nghĩa 'tuyến tính'. Nó không quan trọng những gì liên tục nó nhân với, những gì chỉ có vấn đề là nó ** là ** tuyến tính – zerkms

15

Ví dụ đầu tiên là O(n^2), vì vậy nó có vẻ như họ đã thực hiện một sai lầm. Để tính toán (không chính thức) ví dụ thứ hai, chúng ta có thể làm n * (n/2) = (n^2)/2 = O(n^2). Nếu điều này không có ý nghĩa, bạn cần phải đi và bàn chải ý nghĩa của một cái gì đó là O(n^k) là.

2

Trường hợp đầu tiên chắc chắn O(n^2)

là Thứ hai là O(n^2) cũng vì bạn bỏ qua hằng khi tính toán O lớn

0

phiếu trả lời của bạn là sai, các thuật toán đầu tiên rõ ràng O (n^2) là.

Ký hiệu Big-Oh là "trường hợp xấu nhất" vì vậy khi tính giá trị Big-Oh, chúng tôi thường bỏ qua phép nhân/chia theo hằng số.

Điều đó đang được nói, ví dụ thứ hai của bạn cũng là O (n^2) trong trường hợp xấu nhất bởi vì, mặc dù vòng lặp bên trong là "chỉ" 1/2 n, n là hệ số giới hạn rõ ràng. Trong thực tế thuật toán thứ hai sẽ ít hơn O (n^2) hoạt động - nhưng Big-Oh được dự định là một trường hợp "tồi tệ nhất" (tức là giới hạn tối đa), vì vậy số lượng hoạt động chính xác bị bỏ qua ủng hộ tập trung vào cách thuật toán hoạt động như n tiến tới vô cùng.

+0

Thuật toán thứ hai sẽ không ít hơn O (n^2), nó là * chính xác * O (n^2). Tôi nghi ngờ bạn không hoàn toàn rõ ràng về những gì "O (n^2)" thực sự có nghĩa là. Nó có nghĩa là khi 'n' tiến tới vô cùng, thời gian chạy tăng cho thuật toán cho hai giá trị của' n' là tỷ lệ với sự khác biệt giữa các giá trị 'n' đó bình phương. –

+0

No. Trong thực tế, độ phức tạp thời gian thực tế của thuật toán sẽ hơi nhỏ hơn O (n^2). Tuy nhiên, vì Big-Oh là giới hạn tối đa, chúng ta nói nó là O (n^2). Bạn đúng rằng hệ số 'n/2' bị ràng buộc rõ ràng bởi n - như tôi đã chỉ ra trong câu trả lời của tôi. Có các phép đo giới hạn khác (ví dụ Big-Theta) tính toán hệ số giới hạn khác nhau. – debracey

+0

Tại sao bạn nghĩ độ phức tạp thời gian thực của thuật toán sẽ nhỏ hơn O (n^2)? Tôi tuyên bố nó sẽ * chính xác * O (n^2) vì độ phức tạp của thuật toán * chính xác * khớp với định nghĩa * * của O (n^2). Nếu nó không * chính xác * O (n^2), thì không có gì. Chúng tôi * nói * nó là O (n^2) vì nó ** là ** O (n^2). Bạn dường như muốn làm cho điều này mờ, khó hiểu và không chính xác khi nó là hoàn toàn, tinh thể rõ ràng. –

0

Cả hai đều là O(n^2). Câu trả lời của bạn sai. Hoặc bạn có thể đã viết câu hỏi không chính xác.

Các vấn đề liên quan