-1

私はThe Art of Computer Programming を読んでいます。私には理解できない高度な数学の瞬間がありますが、いくつかの演習は楽しいものでした。

それらの1つを行った後、答えに行きます。本が示唆するものよりも良かったか悪かったかを確認します(通常は悪い)、しかし、現在取り組んでいるものの答えがわかりませんとにかく伝えようとする。

本の質問と提案された解決策はここにあります

私が理解したのは、それtが「欠落している」要素の数であるか、一般的な定数である可能性があるということですが、私が本当に理解していないのは、それらのコンポーネントに基づいてそれらをソートするための一見恣意的な指示であり、私には回転のように見えます一見、元の順序に近づくことはできないため、ホイールを所定の位置に配置します。そして、(とりわけ) 対になった名前の一部を数字に置き換える決定 (ファイル G には、n−t < i ≤ n のすべての対 (i,xi) が含まれます)。

だから私の質問は、単純に、この答えからアルゴリズムを抽出するにはどうすればよいですか?

ちょっとした説明:

私はそれが何を目指しているのか、そしてそれをどのように C++ に翻訳するのかを理解しています。私が理解していないのは、なぜ入力ファイルのコピーをソートすることになっているのか、そうであればどの基準でソートするのか、ペアの片側を数値に変更する理由などです。

4

1 に答える 1

0

名前がソート可能であり、問​​題を解決するのに十分な数のテープ ドライブがあることが前提です。ペアを (name, next_name) として定義します。ここで、next_name は西にいる人の名前です。ペアのファイルのコピーが別のテープに作成されます。最初のファイルは名前でソートされ、2 番目のファイルは next_name でソートされます。テープ ソートは、ボトムアップ マージ ソート、またはポリフェーズ マージ ソートと呼ばれるより複雑なバリエーションですが、この問題には、標準のボトムアップ マージ ソートで十分です。C++ の場合、std::stable_sort() を使用してテープ ソートをエミュレートできます。比較にはラムダ関数を使用し、最初のファイルは名前でソートし、2 番目のファイルは next_name でソートします。

索引付けの用語では、name[1] を使用して最東端の名前を表し、name[n] を使用して最西端の名前を表します。

ペアの 2 つのファイルを最初に並べ替えた後、解決策では、「ファイルの受け渡し」が姓の 2 番目の名前 name[n-1] を識別するために行われると述べられていますが、その方法は指定されていません。その過程で、name[n] も識別されると仮定します。ファイルは順番に比較され、最初のファイルの name と 2 番目のファイルの next_name が比較されます。不一致は、名の name[1] または姓の name[n] のいずれか、またはまれに両方の場合を示します。不一致が何を示しているかを判断するには、各ファイルの次のペアをチェックする必要があります。姓 name[n] が識別された時点で、2 番目のファイル ペアの名前は姓 name[n-1] の次になります。

name[n-1] と name[n] が分かれば、両方のファイルを使用するマージのような操作が実行され、name[n-1] と name[n] をスキップしてペア (name[i], name[ i+2]) i = 1 から n-2 (名前順) の場合、G は (n-1, x[n-1]) と (n, x[n]) の 2 つのペアを名前に含む順序 (G と G' は、最後のステップまで名前順です)。

F は H にコピーされ、アルゴリズムで説明されているように、2、4、8、... のたびに t が 2 倍になる反復プロセスが実行されます。各パスの後、F' には i = 1 から nt までのペア (x[i]、x[i+t]) が含まれ、G' はソートされ、G とマージされて G' に戻されます。 i = nt から n のペア (i, x[i]) を名前順に並べます。最終的に、すべてのペアは i = 1 から n の G (i, x[i]) に名前順に配置され、次に G がインデックス (ペアの左側の部分) で並べ替えられ、名前が並べ替えられた順序になります。

于 2016-07-12T16:24:46.530 に答える