このページでは、しゅんぜい氏の発行されているメルマガのうち「データベース」について
編集して掲載しています。
数値データが格納された配列Xがある。配列の先頭のデータX[0] は 最小であること、X[0] からX[K−1] までは昇順に並んでいることは 分かっているものとする(ただし、K>0)。これをX[0] からX[K] まで昇順に並ぶようにしたい。次のようなアルゴリズムを考えた。 図中の【1】,【2】の部分に当てはまる記号の組合せとして、最も適切な ものはどれか。 _____ ( 開 始 )  ̄ ̄│ ̄ ̄ ┌───┴───┐ │ X[K] → A │ └───┬───┘ ┌───┴───┐ │ K−1 → I │ └───┬───┘ ┌────→│ │ │ │ / \ │ / \ │ /X[I]:A\【2】 │ \ /──────────┐ │ \ / │ │ \ / │ │ │【1】 │ │┌────┴─────┐ ┌────┴────┐ ││X[I] → X[I+1]│ │A → X[I+1] │ │└────┬─────┘ └────┬────┘ │ ┌───┴───┐ │ │ │ I−1 → I │ │ │ └───┬───┘ │ │ │ ──┴── └─────┘ ( 終 了 )  ̄ ̄ ̄ ̄ ̄ ┌───────┬───────┐ │ 【1】 │ 【2】 │ ┌─┼───────┼───────┤ │ア│ > │ ≦ │ ├─┼───────┼───────┤ │イ│ ≧ │ < │ ├─┼───────┼───────┤ │ウ│ < │ ≧ │ ├─┼───────┼───────┤ │エ│ ≦ │ > │ ├─┼───────┼───────┤ │オ│ ≠ │ = │ └─┴───────┴───────┘ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ■解答■(出典:H8. プロダクション 問7) ---------------------------------------------------------------------- ┌───────┬───────┐ │ 【1】 │ 【2】 │ ┌─┼───────┼───────┤ │ア│ > │ ≦ │ └─┴───────┴───────┘ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ■解説■ ---------------------------------------------------------------------- 今週は、フローチャート特集をやっています。 今日は挿入ソートに関する問題でした。ちょっと古めの問題ですが、手元に 問題がなかったので、これになりました。選択肢が5コのころです。 さっそく考えていきましょう。 問題文から配列Xは、X[0] からX[K] までの(k+1)コの要素から 成る配列です。また、X[0] からX[K−1] まではソート済みです。 つまり、X[K] の値のみソートされていません。このX[K] の要素を 「どこに入れれば良いのか?」を順に探していくのが挿入ソートです。 つまり、 X[K] (これをどこかに入れる) ↓ │1│2│ ・・・ │7│9│★│ └─┴─┴ ┴─┴─┴─┘ ↑ ↑ X[0] X[K−1] (これらの値は、ソート済み) となります。 今日は、フロチャートを区切って見ていきたいと思います。 まずは、最初の部分です。 > _____ > ( 開 始 ) >  ̄ ̄│ ̄ ̄ > ┌───┴───┐ > │ X[K] → A │ > └───┬───┘ > ┌───┴───┐ > │ K−1 → I │ > └───┬───┘ ここは、並び替える前の準備段階です。これから挿入するX[K] を変数A に入れておき、ループの添え字のIに(k−1)を代入します。 > (続 き) > │ > ┌────→│ > │ │ > │ / \ > │ / \ > │ /X[I]:A\【2】 > │ \ /──────────┐ > │ \ / │ > │ \ / │ > │ │【1】 │ > │┌────┴─────┐ ┌────┴────┐ > ││X[I] → X[I+1]│ │A → X[I+1] │ > │└────┬─────┘ └────┬────┘ > │ ┌───┴───┐ │ > │ │ I−1 → I │ │ > │ └───┬───┘ │ > │ │ ──┴── > └─────┘ ( 終 了 )  ̄ ̄ ̄ ̄ ̄ さて、メインの部分です。 まず、X[I]とAを比較しています。Iは(k−1)という値を入れたこと と、【1】の方を見ればわかりますが、値はだんだん減っていきます。 つまり、下の図で言えば、Aに入っている値と「9」の値を比較します。 わかりやすくするために、Aに入っている値(★)を7にしてみます。 Iの位置 ↓ │1│2│ ・・・ │6│9│★│ │7│ └─┴─┴ ┴─┴─┴─┘ └─┘ ↑ ↑ ↑ X[0] X[K−1] A 「7」と「9」を比べた場合、「7」の方が小さいです。・・・(*) そうなると、次は「7」と「6」を比べることになりますね。 つまり、Iが1減らなくてはいけません。 Iの位置 ↓ │1│2│ ・・・ │6│9│★│ │7│ └─┴─┴ ┴─┴─┴─┘ └─┘ ↑ ↑ ↑ X[0] X[K−1] A よって、【1】の方に進むには(*)から「X[I] > A」である 必要があります。(【1】の答えは > と予想できる) 【1】の方の流れとして、X[I] → X[I+1] というのは、 比較し終わった要素をずらしている作業になります。 (この場合は、9が右にずれる) ↓ │1│2│ ・・・ │6│ │9│ │7│ └─┴─┴ ┴─┴─┴─┘ └─┘ ↑ ↑ ↑ X[0] X[K−1] A 話を続けましょう。同じことを繰り返します。今度は「7」と「6」を 比べると、「6」の方が小さいですね。・・・(**) つまり、「X[I] < A」になっています。 したがって、【2】は < と予想できます。 さらに、そのまま【2】に進むと A → X[I+1] とあるので 下の図のように、空白部分に「7」が入り、ソートが完了します。 Iの位置 I+1の位置 ↓ ↓ │1│2│ ・・・ │6│ │9│ │7│ └─┴─┴ ┴─┴─┴─┘ └─┘ ↑ ↑ ↑ X[0] X[K−1] A この時点で、考えられる答えは「ア」or「イ」ですね。 この判断は、Aに入っている値とX[0] の値が同じ場合を考えます。 Aに入っている値とX[0] の値が同じ場合、上の例を用いれば、 最終的な状態は下のようになっているはずです。 Iの位置 ↓ │1│ │ ・・・ │6│9│ │1│ └─┴─┴ ┴─┴─┴─┘ └─┘ ↑ ↑ ↑ X[0] X[K−1] A この場合、Aの値をI+1に該当する部分に挿入しないとソートが完了 しません。つまり、Aに入っている値とX[0] の値が同じ場合でも、 ソートを完了させるには、X[I] ≦ Aである必要があるのです。 したがって、「ア」が正解になります。
DMA(H9. プロダクション 問17) DMA(直接アクセス)制御方式による入出力処理の記述として、最も適切な ものはどれか。 ア CPU が入出力装置を直接制御してデータ転送を行う。 イ CPU を介さずに入出力装置と主記憶装置の間のデータ転送を行う。 ウ チャネル接続によって入出力装置と主記憶装置の間のデータ転送を行う。 エ 入出力制御専用のプロセッサによってデータ転送を制御する。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ■解答■(出典:H9. プロダクション 問17) ---------------------------------------------------------------------- イ CPU を介さずに入出力装置と主記憶装置の間のデータ転送を行う。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ■解説■ ---------------------------------------------------------------------- 引き続き、アーキテクチャの特集です。 今日は、DMA(Direct Memory Access) 制御方式に関する問題でした。 昨日、DMA について少し出てきたのですが、質問があったので もう1問取り上げました。ちょっと古めの問題です。 選択肢を順に見ていきましょう。 > ア CPU が入出力装置を直接制御してデータ転送を行う。 これは、直接制御(プログラムコントロール)方式のことです。 CPU が入出力動作を直接制御します。 よって、その間は CPU が他の制御ができなくなるので、CPU の利用 効率が落ちてしまいます。 イメージとしては、こんなカンジです。 細線がバス、太線がデータの流れを表していると思ってください(^^; ┌─────┐ ┏━━┿ 主記憶 │ ┌────┐┃┌─┤(メモリ)│ │ ┏┿┛│ └─────┘ │CPU┃├─┤ │ ┗┿┓│ ┌────────┐ ┌────┐ └────┘┃└─┤ 入出力 ├─┤周辺装置│ ┗━━┿ コントローラ ┿━┿ │ └────────┘ └────┘ > イ CPU を介さずに入出力装置と主記憶装置の間のデータ転送を行う。 これが、正解です。 DMA(Direct Memory Access) 制御方式とは、CPU を介さずに 入出力装置と主記憶装置の間のデータ転送を行う方式です。 と言っても、データ転送が行われるまでは CPU が入出力制御を行う のですが、CPU からの入出力命令があると CPU は DMA コントローラ という入出力制御専用のチップにその情報を送ります。 その後は、DMA コントローラが入出力を制御します。ただ、入出力 データの転送が開始されるまでと、入出力動作中にバスで競合が起きた 場合には CPU が待たされることになります。 イメージは、こんなカンジです。 ┌─────┐ ┏━┿ 主記憶 │ ┌───┐┃┌┤(メモリ)│ │ │┃│└─────┘ │CPU├╂┤ │ │┃│┌────────┐┌────────┐┌────┐ └───┘┃└┤ DMA ├┤ 入出力 ├┤周辺装置│ ┗━┿ コントローラ ┿┿ コントローラ ┿┿ │ └────────┘└────────┘└────┘ > ウ チャネル接続によって入出力装置と主記憶装置の間のデータ転送を行う。 これは、チャネル制御方式のことです。 チャネルがデータ転送制御のためのプログラムを主記憶から自律的に 読み出して入出力装置を制御することによって、DMA 制御方式よりも 並行処理の度合いを高めた方式です。 DMA 制御方式は、CPU に頼まれてから仕事をすると言うイメージで、 チャネル制御方式は、CPU と無関係に仕事をすると言うイメージです。 イメージは、こんなカンジです。 ┌─────┐ │ 主記憶 │ ┌───┐ ┌┤(メモリ)│ │ │ │└┬╂───┘ │CPU├─┤ │┃ │ │ │┌┴╂────┐┌────────┐┌────┐ └───┘ └┤ チャネル ├┤ 入出力 ├┤周辺装置│ │ ┿┿ コントローラ ┿┿ │ └──────┘└────────┘└────┘ > エ 入出力制御専用のプロセッサによってデータ転送を制御する。 これは、入出力制御専用プロセッサ方式のことでしょう(?) 入出力制御専用プロセッサでデータを制御します。 #うーん、最後があやしい・・・。