2017-09-01 7 views
-1

DBMSプロジェクトの外部マージソートを実装しようとしています。私はそれぞれ20ページで3つのファイルを持ち、バッファサイズは20ページです。 これらはそれぞれ私が今ソートしています。したがって、20ページの3つのファイルすべてがソートされます。今私は各ファイル(6x3 = 18ページ)と1ページの6ページを持って来る必要が合併中の出力を書き込む。そして、これは完全なファイルをソート済みにするために4回行わなければなりません。 しかし、これらのファイルをすべてマージするのは難しいですか?任意のステップすべてのページがバッファサイズに持ち込まれることを確認する3ファイルのマージを実行する方法。すべての再帰関数? すべてのファイルの内容は配列a [fileno] [pageno]形式で格納されます 例a [1] [20] = 5は、ファイル1の20ページ目に5というデータがあることを意味します。 ファイルのページが整数を保持していると仮定します。外部マージソート

答えて

1

3ウェイマージを行うと仮定すると、それは3つの入力と1つの出力であり、1回だけ行う必要があります。バッファーを4ページに分けて、それぞれ5ページ。 3ファイルの最初の5ページを読み込み、それぞれを5ページバッファに読み込みます。 3つのバッファのそれぞれの最初のレコードを比較して3つの方法のマージを開始し、最小のものを出力バッファに移動します。出力バッファがいっぱいになると(5ページ)、書き出して続けます。入力バッファが空になったら、そのファイルの次の5ページを読み込みます。

3つの入力ファイルのいずれかの終わりに達すると、コードは2ウェイマージに切り替わります。コードを単純化するには、ファイル関連のパラメーターをファイル0とファイル1のパラメーターにコピーします。ファイル2が最初に空になったら、何もする必要はありません。最初にファイル1が空になったら、ファイル2のパラメータをファイル1にコピーします。ファイル0が最初に空になったら、ファイル1のパラメータをファイル0にコピーし、ファイル2のパラメータをファイル1にコピーします。次に、ファイル0とファイル1を使用して2ウェイをマージします。

2つの入力ファイルの終わりに達すると、残りのファイルをコピーするようにコードが切り替わります。ファイル0が最初に空になったら、ファイル1のパラメータをファイル0にコピーします。その結果、コピーコードは常にファイル0で動作します。