Đây là câu trả lời dựa trên thuật toán từ bài báo được liên kết bởi Joe: http://arxiv.org/abs/0805.1598
Trước tiên chúng ta hãy xem xét một thuật toán Θ ( n nhật kýn ) sử dụng phép chia và chinh phục.
1) Chia rẽ và chinh phục
Chúng ta được cho
một1,một2, ... ,b1,b2, ...bviết sai rồi
Bây giờ sử dụng phân chia và chinh phục, đối với một số m = Θ ( n ) , chúng tôi cố gắng để có được mảng
[ một1, một2, ... , mộtm, b1, b2, Lọ , bm] , [ am + 1, ... , mộtviết sai rồi, bm + 1, ... bviết sai rồi]
và tái diễn.
Chú ý rằng phần b1,b2,…bm,am+1,…an
là một sự thay đổi theo chu kỳ của
am+1,…an,b1,…bm
bởi m nơi.
Đây là một cổ điển và có thể được thực hiện tại chỗ bằng ba lần đảo ngược và trong thời gian O(n) .
Do đó, phân chia và chinh phục mang đến cho bạn một Θ(nlogn) thuật toán, với một đệ quy tương tự như T(n)=2T(n/2)+Θ(n) .
2) Chu kỳ hoán vị
Bây giờ, một cách tiếp cận khác cho vấn đề là xem xét hoán vị như một tập hợp các chu kỳ rời rạc.
Hoán vị được đưa ra bởi (giả sử bắt đầu từ 1 )
j ↦ 2 jphép chia lấy phần dư2 n + 1
Nếu bằng cách nào đó chúng ta biết chính xác chu kỳ là gì, sử dụng không gian thừa không đổi, chúng ta có thể nhận ra hoán vị bằng cách chọn một phần tử Một , xác định phần tử đó đi đâu (sử dụng công thức trên), đặt phần tử vào vị trí đích vào không gian tạm thời, đặt phần tử Một vào vị trí mục tiêu đó và tiếp tục trong chu kỳ. Khi chúng ta hoàn thành một chu kỳ, chúng ta chuyển sang một phần tử của chu kỳ tiếp theo và tiếp tục theo chu trình đó.
Điều này sẽ cung cấp cho chúng tôi thuật toán thời gian Ô (n) , nhưng nó giả định rằng chúng tôi "bằng cách nào đó biết chu kỳ chính xác là gì" và cố gắng thực hiện việc giữ sách này trong giới hạn không gian Ô (1) là điều khiến vấn đề này trở nên khó khăn.
Đây là nơi bài báo sử dụng lý thuyết số.
Nó có thể được chỉ ra rằng, trong trường hợp khi 2 n + 1 = 3k , các yếu tố tại các vị trí 1 , 3 , 32, Lọ , 3k - 1 là trong chu kỳ khác nhau và mỗi chu kỳ có chứa một phần tử ở vị trí 3m, M ≥ 0 .
Này sử dụng thực tế là 2 là một máy phát điện của ( Z / 3k)* .
Do đó, khi 2 n + 1 = 3k , cách tiếp cận theo chu kỳ cung cấp cho chúng tôi thuật toán thời gian Ô (n) , vì với mỗi chu kỳ, chúng tôi biết chính xác bắt đầu từ đâu: sức mạnh của 3 (bao gồm 1 ) (chúng có thể được tính trong Ô (1) không gian).
3) Thuật toán cuối cùng
Bây giờ chúng tôi kết hợp hai phần trên: Chu kỳ phân chia và chinh phục + hoán vị.
Chúng tôi chia và chinh phục, nhưng chọn m sao cho 2 m + 1 là lũy thừa của 3 và m = Θ ( n ) .
Vì vậy, thay vì đệ quy trên cả hai "nửa", chúng tôi chỉ tái diễn trên một và thực hiện thêm Θ ( n ) công việc phụ.
Điều này cho chúng ta sự tái diễn T( n ) = T( c n ) + Θ ( n ) (với một số 0 < c < 1 ) và do đó cung cấp cho chúng ta thuật toán không gian Ô (n) , Ô (1) !