プロダクション

このページでは、しゅんぜい氏の発行されているメルマガのうち「データベース」について

編集して掲載しています。

 

[ ホーム ] [ 上へ ]


挿入ソート(H8. プロダクション 問7)


 数値データが格納された配列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├─┤ │┃
   │   │ │┌┴╂────┐┌────────┐┌────┐
   └───┘ └┤ チャネル ├┤ 入出力    ├┤周辺装置│
          │      ┿┿ コントローラ ┿┿    │
          └──────┘└────────┘└────┘


> エ 入出力制御専用のプロセッサによってデータ転送を制御する。

   これは、入出力制御専用プロセッサ方式のことでしょう(?)
   入出力制御専用プロセッサでデータを制御します。


 #うーん、最後があやしい・・・。

戻る