Existe um algoritmo linear de riffle shuffle no tempo linear? Este é o algoritmo que algumas mãos especialmente hábeis são capazes de executar: dividir uniformemente uma matriz de entrada de tamanho uniforme e depois intercalar os elementos das duas metades.
Mathworld tem uma breve página sobre riffle shuffle . Em particular, estou interessado na variedade de saída aleatória que transforma a matriz de entrada 1 2 3 4 5 6 em 1 4 2 5 3 6. Observe que em sua definição, o comprimento da entrada é .
É fácil fazer isso em tempo linear se tivermos uma segunda matriz de tamanho ou mais útil. Primeiro copie os últimos elementos para a matriz. Então, supondo que a indexação baseado em 0, copiar os primeiros elementos de índices de a . Em seguida, copie os elementos da segunda matriz de volta para a matriz de entrada, mapeando os índices paran [ 0 , 1 , 2 , . . . , N - 1 ] [ 1 , 3 , 5 , . . . , 2 n - 1 ]. (Podemos trabalhar um pouco menos que isso, porque o primeiro e o último elementos da entrada não se movem.)
Uma maneira de tentar fazer isso no local envolve a decomposição da permutação em ciclos disjuntos e, em seguida, reorganizar os elementos de acordo com cada ciclo. Novamente, assumindo a indexação baseada em 0, a permutação envolvida no caso de 6 elementos é
Como esperado, o primeiro e o último elementos são pontos fixos e, se permutarmos os 4 elementos do meio, obtemos o resultado esperado.
Infelizmente, meu entendimento da matemática das permutações (e seus ) é baseado principalmente na wikipedia, e não sei se isso pode ser feito em tempo linear. Talvez as permutações envolvidas nesse embaralhamento possam ser rapidamente decompostas? Além disso, nem precisamos da decomposição completa. Apenas determinar um único elemento de cada um dos ciclos separados seria suficiente, pois podemos reconstruir o ciclo a partir de um de seus elementos. Talvez seja necessária uma abordagem completamente diferente.
Bons recursos na matemática relacionada são tão valiosos quanto um algoritmo. Obrigado!