Độ phức tạp thời gian của thuật toán Sieve of Eratosthenes


95

Từ Wikipedia:

Độ phức tạp của thuật toán là các phép toán O(n(logn)(loglogn))bit.

Làm thế nào để bạn đến đó?

Rằng sự phức tạp bao gồm loglognthuật ngữ nói với tôi rằng có một sqrt(n)nơi nào đó.


Giả sử tôi đang chạy sàng trên 100 số đầu tiên ( n = 100), giả sử rằng việc đánh dấu các số dưới dạng hỗn hợp cần thời gian không đổi (triển khai mảng), số lần chúng tôi sử dụng mark_composite()sẽ giống như

n/2 + n/3 + n/5 + n/7 + ... + n/97        =      O(n^2)                         

Và để tìm số nguyên tố tiếp theo (ví dụ để chuyển đến 7sau khi gạch bỏ tất cả các số là bội của 5), số phép toán sẽ là O(n).

Vì vậy, sự phức tạp sẽ là O(n^3). Bạn có đồng ý không?


5
Tôi không biết về phần còn lại (quá buồn so với bộ não quá buồn ngủ của tôi lúc này), nhưng căn bậc hai bắt nguồn từ thực tế là nếu một số không có ước số nào nhỏ hơn căn bậc hai của nó thì nó là số nguyên tố. Ngoài ra, tôi vừa mới biết rằng loglog (n) có nghĩa là có một căn bậc hai. Đẹp.
R. Martinho Fernandes

13
Làm thế nào để loglog (n) ở đó có nghĩa là có một sqrt (n) ở đâu đó? (@Martinho: Tại sao bạn nói bạn "mới học cái này"?) Phân tích thực tế không liên quan đến bất kỳ căn bậc hai nào!
ShreevatsaR

Câu trả lời:


117
  1. N / 2 + n / 3 + n / 5 +… n / 97 của bạn không phải là O (n), bởi vì số lượng các số hạng không phải là hằng số. [Chỉnh sửa sau khi bạn chỉnh sửa: O (n 2 ) giới hạn trên quá lỏng lẻo.] Giới hạn trên lỏng lẻo là n (1 + 1/2 + 1/3 + 1/4 + 1/5 + 1/6 +… 1 / n) (tổng nghịch đảo của tất cả các số lên đến n), là O (n log n): xem Số hài . Giới hạn trên thích hợp hơn là n (1/2 + 1/3 + 1/5 + 1/7 +…), đó là tổng nghịch đảo của các số nguyên tố lên đến n, là O (n log log n). (Xem tại đây hoặc tại đây .)

  2. Bit "tìm số nguyên tố tiếp theo" chỉ là O (n) tổng thể, được phân bổ - bạn sẽ tiến lên để tìm số tiếp theo chỉ tổng cộng n lần , không phải mỗi bước. Vì vậy, toàn bộ phần này của thuật toán chỉ lấy O (n).

Vì vậy, sử dụng hai điều này, bạn sẽ nhận được giới hạn trên của O (n log log n) + O (n) = O (n log log n) các phép toán số học. Nếu bạn đếm các phép toán bit, vì bạn đang xử lý các số lên đến n, chúng có khoảng log n bit, đó là nơi chứa thừa số của log n, cho phép toán O (n log n log log n) bit.


Đối với một phần của vấn đề, bạn đang xem xét độ phức tạp tiệm cận. Về phần khác, bạn đang xem xét tính phân bổ khấu hao. Tôi bối rối.
crisron

2
@crisron Vấn đề là gì? Không phải trường hợp "độ phức tạp tiệm cận" và "độ phức tạp tính khấu hao" là hai loại khác nhau của cùng một thứ. Khấu hao chỉ là một kỹ thuật để đếm một thứ gì đó cẩn thận hơn, có thể xảy ra phức tạp tiệm cận.
ShreevatsaR

Tất cả những điều này trong khi tôi từng nghĩ chúng khác nhau. Cảm ơn vì đã làm rõ nó.
crisron

1
@ShreevatsaR Tại sao chúng ta tính tổng của chuỗi hài lên đến n số hạng. Chúng ta không nên chỉ tính toán tối đa số hạng sqrt (n)? Đưa ra câu trả lời là theta của n (loglogsqrt (n)) phép tính số học? Ngoài ra, wikipedia nói rằng độ phức tạp không gian là O (n). Đó không phải là theta của n vì chúng ta cần một mảng n phần tử trong mọi trường hợp?
a_123

@ s_123 Có, bạn chỉ có thể tính tối đa √n số hạng, nhưng nó không tạo ra sự khác biệt trong phân tích tiệm cận (hoặc thậm chí là sự khác biệt thực tế đáng kể trong thời gian chạy), bởi vì log (√x) = (1/2) log x với x bất kỳ. Vậy Θ (n log log √n) = Θ (n log log n). Đối với câu hỏi khác của bạn, vâng, độ phức tạp không gian là Θ (n), cũng là O (n): thông thường sử dụng O () để chỉ ra rằng bạn đang chỉ định giới hạn trên, thay vì nói Θ () để biểu thị rằng đó cũng là giới hạn dưới (đặc biệt khi giới hạn dưới là hiển nhiên, như ở đây).
ShreevatsaR

7

Sự phức tạp bao gồm thuật ngữ loglogn cho tôi biết rằng có một sqrt (n) ở đâu đó.

Hãy nhớ rằng khi bạn tìm thấy một số nguyên tố Ptrong khi sàng, bạn sẽ không bắt đầu gạch bỏ các số ở vị trí hiện tại của bạn + P; bạn thực sự bắt đầu bỏ qua các số tại P^2. Tất cả các bội số Pnhỏ hơn P^2sẽ bị gạch bỏ bởi các số nguyên tố trước đó.


10
bản thân câu nói này đúng, nhưng không liên quan đến câu nói được trích dẫn mà bản thân nó không có giá trị gì. Cho dù chúng ta bắt đầu từ phay p^2, độ phức tạp là như nhau (với các mảng truy cập trực tiếp). SUM (1/p) {p<N} ~ log (log N)Là lý do.
Will Ness

6
  1. Vòng lặp bên trong thực n/ihiện các bước, đâu ilà nguyên tố => toàn bộ độ phức tạp sum(n/i) = n * sum(1/i). Theo chuỗi hài nguyên tố, vị sum (1/i)trí inguyên tố là log (log n). Tổng cộng O(n*log(log n)),.
  2. Tôi nghĩ rằng vòng lặp trên có thể được tối ưu hóa bằng cách thay thế nbằng sqrt(n)độ phức tạp thời gian tổng thể sẽ O(sqrt(n)loglog(n)):

    void isprime(int n)
    {
        int prime[n],i,j,count1=0;
        for(i=0;i<n;i++)
        {
           prime[i]=1;
        }
        prime[0]=prime[1]=0;
        for(i=2;i<=n;i++)
        {
            if(prime[i]==1)
            {
                printf("%d ",i);
                for(j=2;(i*j)<=n;j++)
                    prime[i*j]=0;
            }
        }    
    }
    

2
không, thay thế n bằng sqrt (n) làm cho nó ~ n log log (sqrt n) vẫn là ~ n log log n. và isprimehoàn toàn là tên sai để sử dụng ở đó.
Will Ness

-1

Xem giải thích ở trên, vòng lặp bên trong là tổng hài hòa của tất cả các số nguyên tố cho đến sqrt (n). Vì vậy, độ phức tạp thực tế của là O (sqrt (n) * log (log (sqrt (n))))


2
Sai lầm. chúng tôi đánh dấu tất cả các cách đến N: N / 2 + N / 3 + N / 5 + N / 7 + N / 11 + ... = N (1/2 + 1/3 + 1/5 + 1/7 + 1/11 + ...) ~ N log log (sqrt N) ~ N log log N.
Will Ness
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.