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