H23_aki_AP_PM Q02 Ans.

平成23年 秋期 応用情報技術者 午後 問 2
解答と解説

解答例・解答の要点
設問 1
ア count は N より小さい
イ idx は N より大きい
ウ Hash(key)
エ array[idx].key は key と等しくない
設問 2
(1)
シノニムの発生を考慮せずに配列要素を削除するから
または
データ取得の検索時に削除した要素で
終了していまい順次探しにいかないから

(2)

関数Delete()中の”array[idx].key ← 0”の0を-1に変更する。


関数Get()中のwhile文の条件”(array[idx].key は 1 以上)”かつ
(array[idx].key は 999999999 以下)”を
  ”(array[idx].key は 0 以外)”に変更する。

設問 3
データの取得後に排他制御を開始するから
または
関数Getの排他制御が行われていないから

解説
設問 1

上から11行目のendwhileの前と後ろで、処理が分かれている。
上部はcount や idx をインクリメントしているので
シノニム発生後の後続の空き位置を探しているもの推測
また、
12行目の if ~ は、関数の引数である info を array にセット
14行目の else で、オーバーフローの処理

4行目の while のループ処理は
計算したハッシュ値の位置に有効値が入っている間は、
後続の空き位置を探している。

ハッシュ関数で算出した位置に有効なキー値が入っているか
かつ
N個の要素を全てチェック

5行目に count ← count+1 があるので
count が N まで処理されることになる。
したがって

count は N より小さい


配列arrayの最後に到達しても未使用の配列要素がない場合には、
配列arrayの先頭に戻り、未使用の配列要素の検索を続ける。

配列の要素は N まで。
if ~ の前に、idx ← idx+1 があるので
idx が N より大きくなったら、idx ← 1 にしなければならないので
イ idx は N より大きい


idx に 空欄 ウ を、設定している。
以降、配列の位置をさがしている。
空欄 ウ は、ハッシュ関数を取り扱っている場所になるので
ウ Hash(key)


データを取得する関数なので、
探したい key と、格納している key が一致していない場合は
後続の位置をさがしているので
エ array[idx].key は key と等しくない

設問 2
(1)
①あるデータを削除すると、別のデータの取得に失敗した。
削除するデータと取得できなくなるデータには関連があり、
再現方法を容易に分かった。

図3のデータ削除関数で、削除した要素の key に 0 を格納している。
図2のデータ取得関数で、idx ← 0 は、データ取得失敗としている。

key は、1~999999999 の間で使用していて
0 は、データ取得失敗
したがって
(1)
シノニムの発生を考慮せずに配列要素を削除するから
または
データ取得の検索時に削除した要素で
終了していまい順次探しにいかないから


(2)
図3のデータ削除関数で、削除した要素の key に 0 を格納している。
これでは、データがないのか、削除したのか、わからない。
そこで、0以外の数字を入れればいい。
よって

関数Delete()中の”array[idx].key ← 0”の0を-1に変更する。

さらに
図2のデータ取得関数の while の条件を変える必要がでてくる。
後続を検索したいので「0以外」に変更することで、対応できる。
したがって

関数Get()中のwhile文の条件”(array[idx].key は 1 以上)”かつ
(array[idx].key は 999999999 以下)”を
  ”(array[idx].key は 0 以外)”に変更する。

設問 3
図4では、ハッシュ関数で key を加工したあとにロックをかけ
データを格納し、その後アンロックしている。
これでは
1行目でデータが格納済か確認するタイミングが、複数クライアントで
同じタイミングで発生した場合に問題が生じてしまう。
例えば
A→Bの順番で処理するタイミングが近い場合
①データが確認済かを確認
②なければ格納
という順番なので、Bは重複して書き込まないはずになるが
Aが書き込む前に、Bが空き確認すると、
Bから見ると空いている状態になり、
Bも書込みを行う流れになる。
この結果
AもBも配列に重複して格納されてしまう。
よって
データの取得後に排他制御を開始するから
または
関数Getの排他制御が行われていないから

一覧に戻る

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント