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à .
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.)
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à
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.
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!