HeapのアルゴリズムをA (琥珀色)、B (青色)、C (シアン)、D (ダークレッド)の4文字に使ってできる24の置換と23のスワップの図
Heapのアルゴリズム はn 個のオブジェクトの全ての置換 を生成するアルゴリズムである。1963年にB. R. Heapによって提案された。[ 1] このアルゴリズムは移動を最小化する。つまり、各置換は前の置換から1ペアを交換するだけで生成され、他のn −2 要素を操作する必要はない。1977年の置換生成アルゴリズムの論評で、Robert Sedgewickはこのアルゴリズムをコンピュータによる現時点で最も効率的な置換生成用アルゴリズムと結論づけた。[ 2]
Heapのアルゴリズムによって生成されたn 個のオブジェクトの置換列はn +1 個のオブジェクトの置換列の最初になっている。したがってHeapのアルゴリズムは無限置換列を生成する(オンライン整数列大辞典 の数列 A280318 )。
概要
異なるn 要素の置換を考える。Heapはこれらの要素の各置換をそれぞれ1度だけ生成するために入れ替える要素のペアを選択する体系的方法を発見した。その方法を再帰的やりかたで説明しよう。まずカウンターi を0にセットする。そして以下のステップをi がn と等しくなるまで繰り返す。まず最後の要素と隣接する最初のn −1 要素の置換(n −1)! 個をアルゴリズムで生成する。これは最後の要素で終わる置換を全て生成する。次にn が奇数の場合最初の要素と最後の要素を入れ替え、n が偶数の場合はi 番目の要素と最後の要素を入れ替える(最初のイテレーションではn の偶奇で違いはない)。i に1を加算し、最初に戻る。各イテレーションでこのアルゴリズムは「最後」の位置に移動した要素で終わる全置換を生成する。以下の疑似コードは長さn のデータ配列の全置換を出力する。
procedure generate ( n : integer , A : array of any ) :
if n = 1 then
output ( A )
else
for i := 0 ; i < n ; i += 1 do
generate ( n - 1 , A )
if n is even then
swap ( A [ i ] , A [ n - 1 ])
else
swap ( A [ 0 ] , A [ n - 1 ])
end if
end for
end if
このアルゴリズムは非再帰的に書くこともできる。[ 3]
procedure generate ( n : integer , A : array of any ) :
c : array of int
for i := 0 ; i < n ; i += 1 do
c [ i ] := 0
end for
output ( A )
i := 0 ;
while i < n do
if c [ i ] < i then
if i is even then
swap ( A [ 0 ] , A [ i ])
else
swap ( A [ c [ i ]] , A [ i ])
end if
output ( A )
c [ i ] += 1
i := 0
else
c [ i ] := 0
i += 1
end if
end while
関連項目
脚注