線形時間インプレースリフルシャッフルアルゴリズム
線形時間インプレースリフルシャッフルアルゴリズムはありますか?これは、いくつかの特に器用な手が実行できるアルゴリズムです。偶数サイズの入力配列を均等に分割してから、2つの半分の要素をインターリーブします。 Mathworldには、リフルシャッフルに関する簡単なページがあります。特に、入力配列1 2 3 4 5 6を1 4 2 5 3 6に変換するout-shuffleに興味があります。定義では、入力長はことに注意してください2n2n2n。 サイズnnn以上の便利な2番目の配列がある場合、線形時間でこれを実行するのは簡単です。最初に最後のnnn要素を配列にコピーします。次いで、0ベースのインデックスを仮定すると、最初のコピーnnnインデックスから要素を[0,1,2,...,n−1][0,1,2,...,n−1][0,1,2,...,n-1]に[0,2,4,...,2n−2][0,2,4,...,2n−2][0, 2, 4,...,2n-2]。次に、nをコピーしますnnn入力配列、マッピングインデックスに二番目の配列の後ろからの要素[0,1,2,...,n−1][0,1,2,...,n−1][0,1,2,...,n-1]に[1,3,5,...,2n−1][1,3,5,...,2n−1][1,3,5,...,2n-1]。(入力の最初と最後の要素が移動しないため、それよりもわずかに少ない作業を行うことができます。) これをインプレースで実行しようとする1つの方法は、順列をばらばらのサイクルに分解し、各サイクルに従って要素を再配置することです。繰り返しますが、0ベースのインデックス付けを想定すると、6要素の場合に含まれる順列は σ=(001224314355)=(0)(5)(1243).σ=(012345024135)=(0)(5)(1243). \sigma=\begin{pmatrix} 0 & 1 & 2 & 3 & 4 & 5 \\ 0 & 2 & 4 & 1 & 3 & 5\end{pmatrix}=\begin{pmatrix}0 \end{pmatrix} \begin{pmatrix}5 \end{pmatrix} \begin{pmatrix}1 & 2 & 4 &3 …