2017-08-12 15 views
6

chức năng ban đầu của tôi để xác định xem một số là số nguyên tố là:Kiểm tra nếu thủ lớn-o

bool is_prime(int x) { 
    for (int y = 2; y < x; ++y) { 
     if (x % y == 0) { 
      return false; 
     } 
    } 
    return true; 
} 

này chạy với một phức tạp của O(x) như bạn có thể đã phải đi đến x.

Tôi đã học được một số cách tối ưu hóa và cần kiểm tra trên tài khoản lớn của tôi. Đây là chương trình được cải tiến:

bool is_prime(int x) 
{ 
    if (x % 2 == 0 && x > 2) { 
     return false; 
    } 
    for (int y = 3; y*y <= x; y += 2) { 
     if (x % y == 0) { 
      return false; 
     } 
    } 
    return true; 
} 

Liệu thực tế là tôi bây giờ đi lên với sự thay đổi sqrt() này để O(sqrt(x))?

+0

@MattTimmermans Đồng ý với bạn và đề xuất của AndyG. Tôi đã viết hàm với 'x' vì vậy nó phải là' x' chứ không phải 'n'. – datta

+0

Một tối ưu hóa khác là tính trước số nguyên căn bậc hai của 'x' (tức là tìm số nguyên' m', sao cho 'm * m' nằm giữa' x-1' và 'x' cho số nguyên' x') . Có các thuật toán hiệu quả (độ phức tạp O (log (x)) hoặc tốt hơn) để tính toán một số nguyên căn bậc hai, mà không cần đến điểm nổi. – Peter

+0

@Peter Ban đầu tôi đã không chuyển đổi dấu chấm động, nhưng toán học cho thấy rằng 'm * m' sẽ phục vụ mục đích của nó ở đây. – datta

Trả lời

7

Có, nhưng đây không phải là n s. Độ phức tạp của hàm mới của bạn là O (sqrt (x)). Khi bạn nói O (N) và không chỉ định những gì N, thường được gọi là kích thước của đầu vào. Điều này gây nhầm lẫn cho các hàm lấy một đối số số, vì vậy trong những trường hợp đó, bạn nên rõ ràng.

1

Tuyệt đối, Sự phức tạp của chức năng mới của bạn là

O (sqrt (x))

Nhưng vẫn còn, có một số chỗ cho tối ưu hóa. Hãy xem mã được đề cập bên dưới:

bool isPrime(int n) 
{ 
    // Boundary cases 
    if (n <= 1) return false; 
    if (n <= 3) return true; 

    // This is checked so that we can skip 
    // middle five numbers in below loop 
    if (n%2 == 0 || n%3 == 0) return false; 

    for (int i=5; i*i<=n; i=i+6) 
     if (n%i == 0 || n%(i+2) == 0) 
      return false; 

    return true; 
} 
Các vấn đề liên quan