web-dev-qa-db-ja.com

TAOCP「サイクル形式での乗算順列」からアルゴリズムを理解する際の問題

TAOCP Volume1で説明されている1つのアルゴリズムを理解できません。次のページに記載されている例と比較しながら、「アルゴリズムA」と名付けられたセクション1.3.3は、「サイクル形式で順列を乗算する」と記載されています。

明確でないステップは、8行目と9行目に記載されています。 CURRENT値が「d」であった前の反復の後で「CURRENT」値が「g」になるにはどうすればよいですか?

詳細については、Knuthによる「TheArt of Computer Programming Volume1」(セクション1.3.3)を参照してください。このアルゴリズムの詳細な説明が含まれています。

詳細なアルゴリズム:

アルゴリズムA(サイクル形式で順列を乗算します)

このアルゴリズムは、(6)のようなサイクルの積を取り、互いに素なサイクルの積の形で結果の順列を計算します。簡単にするために、シングルトンサイクルの削除についてはここでは説明しません。これは、アルゴリズムのかなり単純な拡張です。このアルゴリズムが実行されると、入力式の要素に連続して「タグ付け」されます。つまり、処理された入力式のシンボルを何らかの方法でマークします。

  • A1。 [最初のパス。]すべての左括弧にタグを付け、各右括弧を、対応する左括弧に続く要素のタグ付きコピーに置き換えます。 (表1の例を参照してください。)
  • A2。 [開く。]左から右に検索して、入力の最初のタグなし要素を見つけます。 (すべての要素がタグ付けされている場合、アルゴリズムは終了します。)STARTをそれに等しく設定します。左括弧を出力します。要素を出力します。タグを付けます。
  • A3。 [CURRENTを参照してください。] CURRENTを式の次の要素に等しく設定します。
  • A4。 [数式をスキャンします。]数式の最後に到達するか、CURRENTに等しい要素が見つかるまで、右に進みます。後者の場合は、タグを付けて手順A3に戻ります。
  • A5。 [CURRENT = START?] CURRENT i- STARTの場合、CURRENTを出力し、式の左側から再開するステップA4に戻ります(これにより、出力でサイクルの開発が続行されます)。
  • A6。 [閉じる。](出力に完全なサイクルが見つかりました。)右括弧を出力して、ステップA2に戻ります。
5
user100202

私の本のコピーでは、行#7の現在の値d、行#8の現在の値g、行#9の現在の値a。したがって、次のように、行#7と#8の間の遷移について混乱していると仮定します。

Row #  After step no.  START  CURRENT  ( a c f g a ( b c d b ( a e d a ( f a d e f ( b g f a e b  Output
  #7        A5           a       d     x x       x x   x   x x     x x x   x     x x           x    d
  #8        A5           a       g     x x       x x   x x x x     x x x   x     x x x         x    g

行#8は、行#7で説明されている状態から始まり、ステップA5を実行します。これにより、カーソルがリストの先頭に戻り、ステップA4に戻ります。ここで、ステップA4は3回実行されます。

  1. d;に達するまで続行します。 CURRENTに等しいため、dにタグを付けます。 bはこの特定のdの後に来るため、CURRENTをbに設定します。
  2. 別のヒットするまで続行しますb; CURRENTに等しいため、bにタグを付けます。 gはこの特定のbの後に来るため、CURRENTをgに設定します。
  3. 別の要素が見つからないため、要素の最後に到達するまで続行しますg

行7と8を比較すると、新しくタグ付けされたdbを確認できます。特に、行#8のステップA5内のステップA4の2回目の反復が、CURRENTの原因です。 gに設定します。

2
Arseni Verner