Skip to content

Files

Latest commit

7d12132 · May 12, 2024

History

History
This branch is 6 commits ahead of, 16 commits behind trekhleb/javascript-algorithms:master.

Thuật toán lũy thừa nhanh

Nhấn vào đây để đọc bằng ngôn ngữ khác: English

Sức mạnh của một số cho biết phải sử dụng số đó bao nhiêu lần trong một phép nhân.

Nó được viết dưới dạng một số nhỏ bên phải và phía trên số cơ bản.

Lũy thừa

Độ phức tạp của thuật toán ngây thơ

Làm thế nào để tính ab?

Chúng ta nhân a cho chính nó, b lần. Tức là, a^b = a * a * a * ... * a (b lần của a).

Phép tính này sẽ mất O(n) thời gian vì chúng ta cần thực hiện phép nhân chính xác n lần.

Thuật toán lũy thừa nhanh

Liệu chúng ta có thể làm tốt hơn so với thuật toán ngây thơ không? Có, chúng ta có thể giải quyết bài toán lũy thừa trong thời gian O(log(n)).

Thuật toán sử dụng phương pháp chia để trị để tính lũy thừa. Hiện tại, thuật toán này hoạt động cho hai số nguyên dương XY.

Ý tưởng đằng sau thuật toán dựa trên sự thật rằng:

Đối với Y chẵn:

X^Y = X^(Y/2) * X^(Y/2)

Đối với Y lẻ:

X^Y = X^(Y//2) * X^(Y//2) * X
trong đó Y//2 là kết quả của phép chia của Y cho 2 mà không có phần dư.

Ví dụ

2^4 = (2 * 2) * (2 * 2) = (2^2) * (2^2)
2^5 = (2 * 2) * (2 * 2) * 2 = (2^2) * (2^2) * (2)

Bây giờ, vì ở mỗi bước chúng ta cần tính lũy thừa X^(Y/2) giống nhau hai lần, chúng ta có thể tối ưu hóa nó bằng cách lưu trữ vào một biến trung gian để tránh tính toán trùng lặp.

Độ phức tạp thời gian

Vì mỗi lần lặp chúng ta chia mũ cho hai, sau đó chúng ta sẽ gọi hàm đệ quy log(n) lần. Do đó, độ phức tạp thời gian của thuật toán được giảm xuống thành:

O(log(n))

Tham khảo