encode-symbolの計算量を計算すればいいっぽい。
encode-symbolはsymbol-in-tree?とelement-of-set?を呼び出しているので、このへんも考慮する。
(define (element-of-set? x set) (cond ((null? set) #f) ((equal? x (car set)) #t) (else (element-of-set? x (cdr set))))) (define (symbol-in-tree? x tree) (let ((symbol-set (symbols tree))) (element-of-set? x symbol-set))) (define (encode-symbol symbol tree) (let ((left (left-branch tree)) (right (right-branch tree))) (cond ((leaf? tree) '()) ((symbol-in-tree? symbol left) (cons 0 (encode-symbol symbol left))) ((symbol-in-tree? symbol right) (cons 1 (encode-symbol symbol right))) (else (error symbol "does not exist in the tree")))))
symbol-in-tree?の計算量は、element-of-set?の計算量とおなじです。element-of-set?のset中の要素数をnとすると、その計算量は
かな。はテキトーな定数。要素が番目にある事象とset内に存在しない事象が等確率で起こると仮定。必ず存在すると仮定した方がきれいになった予感はする。
encode-symbolは木の高さが1以上のとき、以下のような計算をしている。とかはとりあえずな感じの定数。
- 左部分木を取る()
- 右部分木を取る()
- leafかどうかの判断()
- symbol-in-tree?を呼ぶ。要素数は。()
- 木の高さをとしてencode-symbolを呼ぶ
木の高さが0のときは
- 左部分木を取る()
- 右部分木を取る()
- leafかどうかの判断()
なかんじです。
そういうわけで、encode-symbolの計算量をとすると
なのかな。これ解いたらになった。
個のシンボルが存在するとして、一番出現頻度が大きいシンボルは。一番出現頻度が小さいシンボルは。だけどこれをもって出現頻度が大きいシンボルはで小さいシンボルはとは言えない気はするな。