Mọi người phát nhanh và lỏng lẻo với ký hiệu lớn-O. Trong trường hợp của GCD, họ thường làm điều đó theo 2 cách:
1) Bạn đúng, phức tạp về thuật toán và do đó ký hiệu big-O, phải được ghi theo kích thước theo bit của đầu vào , không phải về giá trị của đầu vào. Đó là cách P, NP, vân vân được xác định. Giả sử đầu vào nhị phân và số ngẫu nhiên lớn (như đại diện BigNum), và N số bit đầu vào, GCD của bạn yêu cầu tối đa 2^N phép trừ, mỗi lần yêu cầu thời gian O (N) để chạy trên mỗi chữ số của số bị trừ. Vì vậy, nó là O (N * 2^N). GCD có thể được thực hiện nhanh hơn nhiều nếu bạn sử dụng phép chia chứ không phải phép trừ: O (N^2). Vì vậy, khi chúng ta nói rằng testing primality was proved in 2002 to be done in polynomial time, đó là định nghĩa kỹ thuật về độ phức tạp, và chúng ta ngụ ý đa thức về số chữ số (là phần khó), không đa thức trong chính số đầu vào (điều này dễ dàng thực hiện trong "thời gian phụ tuyến tính" sử dụng phân chia thử nghiệm). Tuy nhiên, trên thực tế, đối với các thuật toán có số lượng đầu vào nguyên cố định, thuận tiện hơn khi nói về độ phức tạp như N là đầu vào, không phải là kích thước của đầu vào. Nó không có hại miễn là bạn rõ ràng những gì bạn có nghĩa là trong trường hợp có thể mơ hồ.
2) Trong thực tế, đầu vào số nguyên thường có kích thước cố định, 32 bit hoặc bất kỳ thứ gì và các thao tác trên chúng như phép cộng, nhân và chia là thời gian O (1). Chúng tôi sử dụng những sự kiện này một cách có chọn lọc trong phân tích thứ tự của chúng tôi. Về mặt kỹ thuật, nếu chương trình GCD của bạn chỉ chấp nhận đầu vào lên đến (2^32-1), thì đó là O (1). Nó có một giới hạn trên cố định vào thời gian chạy của nó. Kết thúc phân tích.
Mặc dù về mặt kỹ thuật, đó không phải là phân tích hữu ích. Hầu hết mọi thứ bạn làm trên một máy tính thực là O (1) trên cùng một cơ sở, rằng kích thước của vấn đề bị hạn chế bởi phần cứng. Nó thường là thuận tiện hơn để chấp nhận rằng bổ sung là O (1) bởi vì các con số có kích thước cố định, nhưng bỏ qua rằng GCD cũng là O (1), giả vờ rằng hành vi của nó trong phạm vi [1, 2^32) kéo dài đến vô cùng và phân tích nó trên cơ sở đó. Sau đó, với N là cực đại của hai đầu vào, nó xuất hiện O (N): O (N) phép trừ, mỗi lần lấy không đổi.
Một lần nữa, điều này không rõ ràng khi bạn biết thuật ngữ tham chiếu là gì, nhưng hãy cẩn thận so sánh sai phân tích đầu tiên mà tôi đưa ra với thuật toán Euclid với phân chia, O (N^2). phép trừ, O (N). N không giống nhau trong mỗi phép trừ và trừ là không phải nhanh hơn ;-)
vui lòng đọc câu hỏi SO hiện có + câu trả lời về chủ đề này. –
Mã của bạn, BTW, tìm ước số chung ** lớn nhất ** (gcd), còn được gọi là yếu tố chung cao nhất (hcf). "Mẫu số chung nhỏ nhất" của một tập hợp các phân số là phổ biến nhất ** nhiều ** của mẫu số, đó là cái gì khác. [Đối với hai số nguyên x và y, chúng ta có lcm (x, y) = xy/gcd (x, y).] – ShreevatsaR
ShreevatsaR, cảm ơn, tôi đã thay đổi nó. Tiếng Anh không phải là ngôn ngữ mẹ đẻ của tôi, vì vậy tôi không chắc nó được gọi là gì. –