「図書系職員のための アプリケーション開発講習会」 請求記号による館内マップ 検索手法案 「図書系職員のための アプリケーション開発講習会」
目次 請求記号と棚の対応表(テキストファイル)をつくる (いまのところの)お勧め案 RDBで解決する方法 ボツ案です。
請求記号と棚の対応表(テキストファイル)をつくる 請求記号と棚の対応表(テキストファイル)をつくる方法です。 概要は次のとおりです 請求記号でソート可能なように請求記号を数字部分と文字部分に分割する 対応表をあらかじめ、請求記号順にソートしておく リストのトップから順に、検索する請求記号との大小比較を行う バイナリサーチのロジックを使えば、より高速化できるかもしれません。
問題は、ある請求番号がどのNoに対応するか 請求記号判定用テーブルの用意 階数 No 棚最初 棚最後 4F 1 000:A5[W] 070:B61[W] 照合用データとしては上記でよさそう。 問題は、ある請求番号がどのNoに対応するか 判定する仕組みをつくることですが….
テキストファイルで 以下の情報を用意 ID 階数 No 棚最初(1) 棚最初(2) 棚最初(3) 1 4F 000 A 5 2 070 B 62 3 3F 100 棚最初のみ着目 請求記号順にあらかじめソートしておく
棚の同定 ID 階数 No 棚最初(1) 棚最初(2) 棚最初(3) 1 4F 000 A 5 2 070 B 62 3 3F 100 < “080:C10” < “080:C10” > “080:C10” たとえば、080:C10 をID=1から順に 大小比較しつつスキャン。 レコード3に達したときに、はじめて、 自身より大きな請求番号に達する → そのひとつ前が該当の棚
ここから先はボツ案です。 ためしに考えてみたら、あまりに複雑なので、お勧めしない案です。 考え方を間違えると、どれだけ面倒になるか示すためにいちおう残しました。
まず、上記のようなデータ項目をもつテーブルを作る ボツ案 RDBで解決する方法 ID 階数 No 棚最初(1) 棚最初(2) 棚最初(3) 棚最後(1) 棚最後(2) 棚最後(3) 1 4F 000 A 5 070 B 61 まず、上記のようなデータ項目をもつテーブルを作る
請求記号による検索 受け取った請求記号を元に、次の手順で検索を行う。 分類ごとに分割する。たとえば、001:C6[W]の場合(大・中・小は機械処理しやすいように分割) 大分類 --- 001 中分類 --- C 小分類 --- 6
条件式を設定する [大分類] <= 棚最初(1) and [大分類] >= 棚最後(1) 例だと次のように解釈される 例にあった。棚最初(1)=000 で棚最後(1)=002のデータがヒットする 大分類が棚最初と同じか、棚最後と同じ場合は次のステップ(2)に進む 棚最初=棚最後の場合はステップ(3)に進む
ステップ(2) [大分類]が棚最初と同じか最後と同じ 大分類が棚最初と同じ場合。 [中分類] >= 棚最初(2) 大分類が棚最後と同じ場合 [中分類] <= 棚最後(2)
ステップ(3) 棚最初(1)と棚最後(1)が同じ場合 次の条件式で実行 [中分類] <= 棚最初(2) and [中分類] >= 棚最後(2)
高速化の切り札 バイナリサーチ バイナリサーチ(2分木探索) ソート済みデータを順に大小比較して処理 情報検索の基本中の基本 高速化の切り札 バイナリサーチ バイナリサーチ(2分木探索) ソート済みデータを順に大小比較して処理 情報検索の基本中の基本 ただし、自作はそれなりに面倒(経験談) 数年前の自作のプログラム(可変長レコード対応)を必要とあれば探してみます。
バイナリサーチの動作原理 (参考 wikipedia) 位置 1 2 3 4 5 6 7 8 9 10 データ 1 11 12 13 17 22 25 28 結果 ○ × × 残り半分の中央値と比較 まず真ん中のデータ(中央値)と比較 “25”の位置情報を求めます!