Thuật toán xáo trộn thời gian tuyến tính tại chỗ


15

Có một thời gian tuyến tính thuật toán xáo trộn tại chỗ? Đây là thuật toán mà một số tay đặc biệt khéo léo có khả năng thực hiện: chia đều một mảng đầu vào có kích thước bằng nhau, và sau đó xen kẽ các phần tử của hai nửa.

Mathworld có một trang ngắn gọn về xáo trộn riffle . Cụ thể, tôi quan tâm đến giống ngoài luồng biến đổi mảng đầu vào 1 2 3 4 5 6 thành 1 4 2 5 3 6. Lưu ý rằng trong định nghĩa của chúng, độ dài đầu vào là .2n

Thật đơn giản để thực hiện việc này trong thời gian tuyến tính nếu chúng ta có một mảng thứ hai có kích thước hoặc tiện dụng hơn. Đầu tiên sao chép phần tử cuối cùng vào mảng. Sau đó, giả sử lập chỉ mục dựa trên 0, sao chép phần tử đầu tiên từ các chỉ số sang . Sau đó sao chép phần tử từ mảng thứ hai trở lại mảng đầu vào, ánh xạ các chỉ số thành . (Chúng ta có thể thực hiện công việc ít hơn một chút so với điều đó, bởi vì các yếu tố đầu tiên và cuối cùng trong đầu vào không di chuyển.)nnn[0,1,2,...,n1][0,2,4,...,2n2]n[0,1,2,...,n1][1,3,5,...,2n1]

Một cách để cố gắng thực hiện việc này tại chỗ liên quan đến việc phân tách hoán vị thành các chu kỳ rời rạc, và sau đó sắp xếp lại các yếu tố theo từng chu kỳ. Một lần nữa, giả sử lập chỉ mục dựa trên 0, hoán vị liên quan đến trường hợp 6 phần tử là

σ=(012345024135)=(0)(5)(1243).

Như mong đợi, các yếu tố đầu tiên và cuối cùng là các điểm cố định và nếu chúng ta hoán vị 4 yếu tố ở giữa, chúng ta sẽ nhận được kết quả mong đợi.

Thật không may, sự hiểu biết của tôi về toán học hoán vị (và của họ ) chủ yếu dựa trên wikipedia và tôi không biết liệu điều này có thể được thực hiện trong thời gian tuyến tính hay không. Có lẽ các hoán vị liên quan đến sự xáo trộn này có thể nhanh chóng bị phân hủy? Ngoài ra, chúng ta thậm chí không cần phân tách hoàn toàn. Chỉ cần xác định một yếu tố duy nhất của mỗi chu kỳ rời rạc là đủ, vì chúng ta có thể xây dựng lại chu trình từ một trong các yếu tố của nó. Có lẽ một cách tiếp cận hoàn toàn khác là cần thiết.LATEX

Tài nguyên tốt về toán học liên quan cũng có giá trị như một thuật toán. Cảm ơn!


Có một giải pháp thời gian (có thêm không gian ). Tôi không biết bất kỳ giải pháp thời gian tuyến tính. O(nlgn)O(1)
Radu GRIGore

4
Điều đó thích hợp hơn cho cs.stackexchange. Trong mô hình không đồng nhất, lần luôn luôn có thể. Trong trường hợp này nên có thể đồng đều. O(n)
Yuval Filmus

1
@Radu Tương tự như câu hỏi này , vấn đề này có lẽ không có giải pháp chỉ sử dụng thêm không gian , nhưng không gian thêm . O ( log n )O(1)O(logn)
Tyson Williams

2
Tôi nhận xét của tôi (và bỏ phiếu để đóng) trở lại! (Mặc dù câu hỏi đã được trả lời trong tài liệu.)
Yuval Filmus

1
Tôi đã nghe câu hỏi này từ một sinh viên CS tuần trước, người đã nghe nó tại một cuộc phỏng vấn xin việc.
Jeffε

Câu trả lời:


12

Vấn đề đáng ngạc nhiên là không tầm thường. Đây là một giải pháp hay của Ellis và Markov, In-Case, Stable Sáp nhập bằng cách hoàn hảo Shuffle (phần 7). Ellis, Krahn và Fan, tính toán các chu kỳ trong phép xáo trộn hoàn hảo đã thành công trong việc chọn "các nhà lãnh đạo chu kỳ", với chi phí nhiều bộ nhớ hơn. Cũng liên quan là bài báo hay của Fich, Munro và Poblete, Permuting In Place , đưa ra thuật toán thời gian cho mô hình nhà tiên tri. Nếu chỉ có một lời tiên tri cho hoán vị có sẵn, thuật toán yêu cầu không gian logarit; nếu chúng ta cũng có một lời tiên tri cho nghịch đảo, nó đòi hỏi không gian không đổi.O(nlogn)

Bây giờ cho giải pháp của Ellis và Markov. Đầu tiên, giả sử . Sau đó, tính toán sự xáo trộn hoàn hảo của đơn hàng n làm giảm việc tính toán sự xáo trộn hoàn hảo của các đơn hàng xy , với một vòng quay trước chúng. Dưới đây là một bằng chứng bằng ví dụ ( n = 5 , x = 3 , y = 2 ): 012 345 67 89 012 567 34 89 051627 3849n=x+ynxyn=5x=3y=2

012345678901256734890516273849

Ellis và Markov đã tìm thấy một cách dễ dàng để tính toán xáo trộn hoàn hảo khi , sử dụng không gian và thời gian tuyến tính không đổi. Sử dụng điều này, chúng tôi có được một thuật toán để tính toán shuffle hoàn hảo cho n tùy ý . Đầu tiên, ghi n = 2 k 0 + + 2 k w bằng cách sử dụng mã hóa nhị phân của n , và để cho n i = 2 k i + + 2 k w . Xoay n 0 bit ở giữa , xáo trộn tay phải 2 kn=2knn=2k0++2kwnni=2ki++2kwn0 bit. Bỏ qua cácbit2 k 0 bên phải , xoayn1bitở giữavà xáo trộn2 k 1 bitbên tay phải. Và như thế. Lưu ý rằng xoay vòng dễ dàng vì một số phần tử đầu tiên xoay có chức năng như các nhà lãnh đạo chu kỳ. Tổng mức độ phức tạp của luân chuyển làO(n0++nw)=O(n), vìn t + 1 <nt/2. Tổng độ phức tạp của các xáo trộn bên trong làO(2k02k0n12k1O(n0++nw)=O(n)nt+1<nt/2 .O(2k0++2kw)=O(n)

Vẫn còn cho thấy cách tính shuffle hoàn hảo khi . Trong thực tế, chúng tôi sẽ có thể xác định các nhà lãnh đạo chu kỳ, sau công việc cổ điển trên dây chuyền (Fredricksen và Maiorana, Dây chuyền hạt trong k màu sắc và k -ary de chuỗi Bruijn ; Fredricksen và Kessler, Một thuật toán để tạo ra dây chuyền của hạt trong hai màu sắc ).n=2kkk

Kết nối là gì? Tôi cho rằng hoán vị xáo trộn tương ứng với sự dịch chuyển phải của biểu diễn nhị phân. Dưới đây là một bằng chứng bằng ví dụ, với : 000 001 010 011 100 101 110 111 000 100 001 101 010 110 011 111 Do đó, để tìm các nhà lãnh đạo chu kỳ, chúng ta cần tìm một đại diện trong mỗi lớp tương đương của phép quay của chuỗi nhị phân có độ dài k . Các bài báo được đề cập ở trên đưa ra thuật toán sau để tạo tất cả các nhà lãnh đạo chu kỳ. Bắt đầu với 0 kn=8

000001010011100101110111000100001101010110011111
k0k. Tại mỗi bước, chúng ta đang ở một thời điểm nào . Tìm chỉ số tối đa i của một số không bit, chia k bởi tôi để có được k = d i + r , và để cho các điểm sau đây được ( một 1 ... một i - 1 1 ) d một 1 ... một r . Bất cứ khi nào r = 0 , chuỗi mới là một nhà lãnh đạo chu kỳ.một1Giáo dụcmộtkTôikik=di+r(a1ai11)da1arr=0

Ví dụ: khi điều này tạo ra chuỗi 0000 , 0001 , 0010 , 0011 , 0101 , 0110 , 0111 , 1111 .n=16

0000,0001,0010,0011,0101,0110,0111,1111.

Các nhà lãnh đạo chu kỳ được nhấn mạnh.


3
Xem thêm câu trả lời của Aryabhata, sử dụng arxiv.org/abs/0805.1598 . Bài báo đó, "Một thuật toán tại chỗ đơn giản cho xáo trộn" của Jain, sử dụng cùng một ý tưởng, nhưng thay vì quyền hạn của , sử dụng quyền hạn của 3 . Vấn đề là vì 2 là một modulo gốc nguyên thủy 3 k , nên dễ dàng nhận thấy rằng 3 0 , Lít , 3 k là các nhà lãnh đạo chu kỳ. Thậm chí còn đơn giản hơn cả Ellis và Markov! 2323k30,,3k
Yuval Filmus

Mặc dù tôi nghĩ rằng bài viết của Jain đơn giản hơn một chút, tôi thích bài viết trước đó, cũng như bài viết sớm nhất có nhiều phiếu bầu nhất.
Johny

6

Đây là một câu hỏi hạt giống tại cs.stackexchange.com và câu trả lời có tại đây: /cs/332/in-place-alerskym-for-interleaving-an-array/400#400

Đó là một lời giải thích của bài báo: http://arxiv.org/abs/0805.1598 .

k2k32k= =2

j2jmod2n+1


Hà! Tôi hoàn toàn quên mất câu hỏi đó, ngay cả khi tôi tham gia vào cuộc thảo luận. Điều này có nghĩa là tôi đã không thực sự hiểu làm thế nào nó hoạt động thời gian đó.
Radu GRIGore

2

mn=m2if(i)=2Tôiin/2f(Tôi)= =2(Tôimodn/2)-1Tôi>n/2

Ôi(1)Ôi(đăng nhậpn)


À, đợi đã. Điều này giả định rằng tất cả các giá trị trong hoán vị riffle nằm trên cùng một chu kỳ. Chiến lược này sẽ phải được sửa đổi một chút, tùy thuộc vào có bao nhiêu chu kỳ rời rạc.
Robert Robere
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.