調整我的編碼方法,變成先遍歷左側樹葉,如果左側沒有就遍歷右側樹,這樣比我之前寫的需要對比每個樹的symbol,來找到左邊樹要效率高些。
原來的方法
(define (encode-symbol message tree)
(cond ((leaf? tree) null)
((element-of-set? message (symbols (left-branch tree)))
(cons 0 (encode-symbol message (left-branch tree))))
((element-of-set? message (symbols (right-branch tree)))
(cons 1 (encode-symbol message (right-branch tree))))
(else (error "bad bit -- CHOSSE-BRANCH" message))))
參考某大神的寫法
(define (encode-symbol symbol tree)
(if (leaf? tree)
(if (eq? symbol (symbol-leaf tree))
'()
#f)
(let ((left-result (encode-symbol symbol (left-branch tree))))
(if left-result
(cons 0 left-result)
(let ((right-result (encode-symbol symbol (right-branch tree))))
(if right-result
(cons 1 right-result)
#f))))))
然後我們計算最頻繁符號和最不頻繁符號的遍歷過程,如果有n個符號,則最不頻繁的符號遍歷n次樹節點,最頻繁的節點會遍歷整個樹節點,樹節點的個數爲2n-1個,所以每次會遍歷2n-1次,如果n個符號,將會遍歷n*(2*n-1)次。