応用情報22年秋 午前 問6

【中分類】
アルゴリズムとプログラミング−2.アルゴリズム
   −(2)代表的なアルゴリズム−1 整列・併合・探索のアルゴリズム

【問題を解く前に】

 探索やソート(整列)のアルゴリズムは、データの状況によって、向き不向きがちがいます。ちょっと前までのデータベースでは、実務上でも、それを意識しないといけませんでした(最近は、テキトーに自動でDBがやってくれるのかしら?)

 データのキーの散らばりかたとか、使用頻度などを考えなければ、
   B+木によるインデックスを張った検索が、平均的に早くなります。
   →2分探索木

 ただし、キーの値がキレイに散らばるのであれば、ハッシュが早いです。
  ハッシュは、計算で格納位置を求めますので・・・
  ところが、キーの値の散らばりに偏りがあり、計算で求めるハッシュ値
  で、同じものが(=シノニム)がいっぱい出来てしまうと・・・

  ・・・シノニム内はシーケンシャルでアクセスするため、遅くなります。


 データの使用頻度に偏りがあるなら
  当然、使用頻度順に、順番に(線形に)並べたほうが早いです。

問題は、この知識を聞いています。

【解き方】

まず、Cは、ハッシュのことを差していますので、ハッシュ表探索です。
上記説明から、Bは、線形探索がよさそうですね。
Aは、普通にインデックスを貼る、つまり、2分探索

順番に書くと、

二分探索、線形探索、ハッシュ表探索の順なので・・・

【答え】
(ア)



【解き終わって】

実務では、もう少し深い知識が必要かな・・・

●ハッシュを使う場合、そこで、キーの値を順番に採番している場合(AUTO_INCREMENTとか)は、キレイに値が散っているので、いいんだけど、
コードの組み合わせがキーの場合は、偏りが出てしまう。

たとえば、

   年号:社員番号:フラグ

フラグ:0のとき、現在利用、1のとき(論理)削除

 :はとって、一続きの数字をキーとした場合、もし、ハッシュの計算式が、仮に10で割ったあまりごとに分けるとすれば(こんな簡単な式はないですよ、もちろん)、0と1ばかりに偏り、シノニムができる。

 なので、コードの組み合わせを「嫌う人もいる」
 →ほかに、便利なことがあるので、嫌わない人も多い。


●それと、各データベースにおいて、上記アルゴリズムが、どんなインデックスに対応するのかを知っているのもいいかも・・・

Oracleの場合はたぶん。。。

・使用頻度順にアクセスしたければ、使用頻度順に格納しなおして、シーケンシャルアクセスにするのかなあ?

・2分探索、は普通のインデックス(B+)を貼ればなると思う

・ハッシュは、ハッシュ

・このほかに、ビットマップインデックスというのがある。

→詳しくは、自分で調べてね!

MySQLの場合は・・・

InnoDBは、B+
・ハッシュインデックスっていうのもある。
 メモリーインデックスのときに使うんだけど、
 これは、奥深〜いものがあるので、
 自分で調べてくれ・・・


・・・というように、自分の使っているDBのインデックスは、どういう検索手法を使っているのかを調べておくと、いいと思います。
(調べても、わかんないものもありますけどね・・・)

    • -

そして、実務と関連ある分野の知識

データベース
ネットワーク

などは、基礎理論とあわせて、そのレベルまで深めて勉強しておくと、
仕事をしながら、受験勉強の復習をしていることになるので、有利。