2014年4月29日火曜日

開発環境

計算機プログラムの構造と解釈(Gerald Jay Sussman(原著)、Julie Sussman(原著)、Harold Abelson(原著)、和田 英一(翻訳)、ピアソンエデュケーション、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の2(データによる抽象の構築)、2.3(記号データ)、2.3.3(例: 集合の表現)、順序づけられたリストとしての集合、問題 2.61を解いてみる。

その他参考書籍

問題 2.61

重複なしのリストによる集合の表現を考える

順序づけられた集合の場合、新たに加える要素が既に存在するかを、全集合を操作する必要がない。最悪の場合は、加える要素が集合に存在しない場合ですべての要素を調べることになり、順序づけられていない表現と同じになる。既に集合に含まれている要素を加える場合は、あるときはリストの先頭に近い場所で探索を止めることができ、またあるときはリストの大部分を調べなければならないと考えられる。平均すると集合の半分のものを調べなければならないと考えられる。従って必要なステップ数の平均は、約n/2である。これは、Θ(n)の増加であることは変わりはないが、ステップ数は平均で2倍の改善になる。

コード(BBEdit, Emacs)

ordered_set.scm

#!/usr/bin/env gosh
;; -*- coding: utf-8 -*-

(load "./procedures.scm")

(define (adjoin-set x set)
  (cond ((null? set)
         (cons x
               set))
        ((< x
            (car set))
         (cons x
               set))
        ((= x
            (car set))
         set)
        (else
         (cons (car set)
               (adjoin-set x
                           (cdr set))))))

(define s1 '())
(define s2 '(1))
(define s3 '(5))
(define s4 '(1 2 3 4))
(define s5 '(6 7 8 9))
(define s6 '(5 6 7 8 9))
(define s7 '(2 3 4 5 6))
(define s8 '(1 2 3 4 5))

(for-each (lambda (set)
            (print "(adjoin-set 1 " set ") => "
                   (adjoin-set 5 set)))
          (list s1 s2 s3 s4 s5 s6 s7 s8))

入出力結果(Terminal(gosh), REPL(Read, Eval, Print, Loop))

$ ./ordered_set.scm 
(adjoin-set 1 ()) => (5)
(adjoin-set 1 (1)) => (1 5)
(adjoin-set 1 (5)) => (5)
(adjoin-set 1 (1 2 3 4)) => (1 2 3 4 5)
(adjoin-set 1 (6 7 8 9)) => (5 6 7 8 9)
(adjoin-set 1 (5 6 7 8 9)) => (5 6 7 8 9)
$

0 コメント:

コメントを投稿