Find a binary gap
Find a binary gap
Gần đây, mình gặp 1 bài toán khá đơn giản, nhưng thú vị như sau:
Input: A number
Output: The maximum 0 is written between the two numbers 1 in binary form with the fastest possible speed.
Ví dụ:1
2
3
4
5
6
7
810) bin(
'0b1010'
10) binary_gap(
1
12) bin(
'0b1100'
12) binary_gap(
0
Cách xử lí của mình
Có 2 cách để giải:
Solution 1: Vì số được lưu trong bộ nhớ ở dạng nhị phân , nên mình sẽ ko chuyển từ thập phân sang nhị phân mà đọc từng bit trong bộ nhớ. Vì phép tính nhân chia tốn thời gian hơn phép xor nên mình sẽ sử dụng hoàn toàn các phép xor bit thay nhân chia.
Solution2: Chuyển số từ thập phân sang nhị phân, chia thành các đoạn bằng dsố 1, lấy độ dài đoạn dài nhất.
Code
Solution1
1 | def binary_gap(number): |
Độ phức tạp của thuật toán là O(n) với n là độ dài của số ở dạng nhị phân.
Thời gian chạy thử 10000 số từ 1000000000 đến 1000010001 như bảng dưới đây .
Thời gian tính theo đơn vị giây.
Solution2
1 | def binary_gap2(number): |
Độ phức tạp của bin là O(n) , split là O(n), max là O(n), len là O(1). Vậy tổng là O(n) với n là độ dài của số ở dạng nhị phân.
Thời gian chạy thử 10000 số từ 1000000000 đến 1000010001 như bảng dưới đây .
Thời gian tính theo đơn vị giây.
Solution2 làm nhiều thao tách hơn Solution1 nhưng tốc độ lại nhanh hơn Solution1. Dù cách làm không tối ưu.
Nguyên nhân có thể là vì, Solution2 sử dụng hoàn toàn các hàm có sẵn của hệ thống, đã được biên dịch sẵn. Trong khi Solution1 chạy ở dạng phiên dịch.
Update:2018/08/13
Để kiểm tra suy đoán trên, mình sẽ tạo file thực thi để chạy thẳng code, không thông qua python.
Để làm được điều này, mình sử dụng pyinstaller
1 | sudo pip install pyinstaller |
Kết quả chạy thử Solution1 như sau:
Kết quả chạy thử Solution2 như sau:
Thời gian của Solution1 giảm đáng kể. Trong khi đó, thời gian của Solution2 ko giảm.
Vậy Cách 1 tốt hơn Cách 2 trên lý thuyết và trong thực tế chạy trực tiếp. Suy đoán phía trên là chính xác.
Cách 2 dễ viết hơn, chạy nhanh hơn trong môi trường biên dịch. Cách 2 chạy trực tiếp lâu hơn có thể vì trình biên dịch chưa tối ưu.