2008-10-19 81 views
27

Đối với bài tập về nhà, tôi đã đưa ra 8 đoạn mã sau đây để phân tích và đưa ra một ký hiệu Big-Oh cho thời gian chạy. Ai có thể cho tôi biết nếu tôi đi đúng hướng không?Bài tập về nhà của chữ O Big - Phân tích thuật toán phân đoạn mã?

//Fragment 1 
for(int i = 0; i < n; i++) 
    sum++; 

Tôi đang nghĩ đến O (N) cho đoạn 1

//Fragment 2 
for(int i = 0; i < n; i+=2) 
    sum++; 

O (N) cho đoạn 2 cũng

//Fragment 3 
for(int i = 0; i < n; i++) 
    for(int j = 0; j < n; j++) 
     sum++; 

O (N^2) cho đoạn 3

//Fragment 4 
for(int i = 0; i < n; i+=2) 
    sum++; 
for(int j = 0; j < n; j++) 
    sum++; 

O (N) cho đoạn 4

//Fragment 5 
for(int i = 0; i < n; i++) 
    for(int j = 0; j < n * n; j++) 
     sum++; 

O (N^2) cho đoạn 5 nhưng n * n được ném tôi ra một chút vì vậy tôi không hoàn toàn chắc chắn

//Fragment 6 
for(int i = 0; i < n; i++) 
    for(int j = 0; j < i; j++) 
     sum++; 

O (N^2) cho đoạn 6 như cũng

//Fragment 7 
for(int i = 0; i < n; i++) 
    for(int j = 0; j < n * n; j++) 
     for(int k = 0; k < j; k++) 
      sum++; 

O (N^3) cho đoạn 7 nhưng một lần nữa n * n được ném tôi ra khỏi

//Fragment 8 
for(int i = 1; i < n; i = i * 2) 
    sum++; 

O (N) cho đoạn 8

+0

Tôi không đồng ý với nhận xét "đã được bản địa hóa". Tính toán Big-Oh là phần trung tâm của phân tích thuật toán. Ví dụ mã cụ thể với các ước tính của Big-Oh có thể cực kỳ có giá trị đối với những người đang cố gắng trở nên thành thạo trong lĩnh vực này. – JESii

Trả lời

20

Tôi nghĩ đoạn 5 là O (n^3) và đoạn tương tự 7 là O (n^5) *. Nó cũng giống như O (log (n)) cho mảnh 8.

Đối với các vấn đề n * n, bạn phải thực thi thân của vòng lặp n * n lần, vì vậy nó sẽ là O (n^2) , sau đó bạn hợp chất với thứ tự của mã khác. Đoạn 8 thực sự tăng gấp đôi số lượt truy cập thay vì tăng nó, do đó vấn đề lớn hơn, công việc ít hơn bạn phải làm, vì vậy nó là O (log (n))

* chỉnh sửa: Fragment 7 is O (n^5), không phải O (n^4) như tôi đã từng nghĩ. Điều này là do cả hai j và k chuyển từ 1 thành n * n. Xin lỗi tôi đã không bắt được điều này trước đó.

+0

oh okay, tôi thấy những gì bạn đang nói! Vì vậy, đối với 5, n * n có nghĩa là thân của vòng lặp bên trong sẽ được thực thi thứ tự N^2 lần và kết hợp với thứ tự của N cho vòng lặp bên ngoài, tổng thể nó sẽ là O (N^3). – VeePee

+0

cùng một ý tưởng cho đoạn 7. Người đàn ông mảnh 8 đã hoàn toàn trên đầu của tôi. Xin lỗi nếu điều này là yêu cầu quá nhiều, nhưng tôi chỉ tò mò những gì sẽ mã cho O (Nlog (N)) trông giống như trong trường hợp tôi đã bao giờ chạy vào nó? – VeePee

+1

Đối với thuật toán O (n * log (n)), hãy tưởng tượng một vòng lặp ngoài tính từ 1 đến n và vòng lặp bên trong đi từ 1 đến n bằng cách nhân bộ đếm với 2 lần. Tuy nhiên, nó cực kỳ bất thường để gặp phải các thuật toán như vậy. Thuật toán O (n * log (n)) phổ biến nhất là QuickSort và Merge Sort. –

0

Dường như bạn đang đi đúng hướng. Liên quan đến N * N bạn nghĩ nó có hiệu quả gì? Nó là một yếu tố khác của N nên nó có thể sẽ là thứ tự cao hơn.

Chỉ là một cảnh báo, tôi thấy một bài đăng khác như thế này và nó đã bị vô hiệu. Hãy cẩn thận. Here là bài đăng.

+0

Tôi thực sự upvoted câu hỏi, vì ông (1) rõ ràng đã có một nỗ lực nghiêm trọng trong việc giải quyết các vấn đề và (2) đã trung thực về nó là một bài tập về nhà. – JesperE

+0

Ồ tôi chắc chắn đồng ý, đây là một nỗ lực vững chắc trong vấn đề và một câu hỏi hợp lệ. Tôi chỉ muốn cảnh báo anh ta trong trường hợp những người khác phản ứng kém. Mặc dù trong trường hợp này anh ta vẫn ổn. – smaclell

2

Đối với trường hợp 8 thử viết ra số lần lặp lại cho một số giá trị của N và xem những gì mô hình trông giống như ... nó không phải là O (N)

7

Fragment 7 là O (n^5) , không phải O (n^4) như các lời nhận xét nhận xét hiện đang được chấp nhận. Nếu không, nó là chính xác.

+0

Cảm ơn bạn đã bắt được –

+0

Điều chắc chắn. Đó là lợi ích của một trang web cộng tác. –

0

Bạn đang đi đúng hướng, nhưng đây là mẹo về cách mọi thứ có thể rõ ràng hơn trên đường đi. Giả sử bạn có một số mã:

for(i = 0; i < n; i++) { 
    for(j = 0; j < 100; j++){....} 
} 

Đúng, hãy xem xét thực tế là bạn có mã ở các cấp khác nhau.Trong ví dụ này, bạn chỉ có thể xem 3 cấp cho đến nay:

  1. Các bên ngoài cho vòng lặp mà đi từ 0-n
  2. Một cho vòng lặp mà đi từ 0-100
  3. Một số mã bên trong, được đánh dấu là ...

Không có lúc nào bạn nên tính toán tất cả trong 1 lần. Đây là nơi mà hầu hết người mới bắt đầu thực hiện một số loại lỗi số học. Tính nó riêng cho từng cấp độ và sau đó nhân tất cả lại với nhau.

Chúc may mắn!

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