請求記号による館内マップ検索手法案改改

請求記号による館内マップ
検索手法案
「図書系職員のための
アプリケーション開発講習会」
目次
 請求記号と棚の対応表(テキストファイル)
をつくる
– (いまのところの)お勧め案
 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”の位置情報を求めます!