SICP §2.3.3(集合の表現 その4 [集合と条件検索])

前セクションまでで、様々な方式での集合の表現を見てきたが、なんでこんなことをしてきたかというと、「効率」というものを意識させるため。
で、もう一つ重要な事があって、それはここまでで学んできた各種手法が「情報検索」に関する応用に非常に重要な意味を持ってくるということ。


大量のデータ(企業の従業員情報や会計システムの取引等のレコード)にアクセスする場合、効率の良い手法が必要になるけど、それをレコードを一意に識別する key を定義することで実現する。
例えば従業員情報なら従業員番号とか。会計システムの取引なら取引番号とか。


上述した大量のデータを、データベースのレコードの集合として捉えると、あるキーのレコードを見つける場合に、引数として「キー」と「データベース(レコードの集合)」をとり、対応するレコードを返すか、対応するレコードが存在しなかった場合は「偽」を返す手続、lookup を考えよう。
lookup 手続きは、element-of-set? と殆ど同じ方法で実装できる。
例えばデータベースのレコード群が「順序付けられていない集合」として表現されているなら、

(define (lookup given-key set-of-records)
  (cond ((null? set-of-records) #f)
	((equal? given-key (key (car set-of-records)))
	 (car set-of-records))
	(else
	 (lookup given-key (cdr set-of-records)))))

大きなデータベース(集合)を扱う場合、「順序付けられないリスト」より「ランダムアクセス」みたいな方法の方がいい。(要するにハッシュテーブルみたいなモノじゃね?)

で、まぁ開発初期なら別に非効率なデータ表現を使って、効率の悪い lookup を使っていたとしても、データの持ち方を構成子と選択子で抽象の壁の概念で構築しておけば、あとから効率的な lookup を実装することは可能だよってことを言いたい感じ?(聞くなw)