計算機程序的構造和解釋 練習題2.72

調整我的編碼方法,變成先遍歷左側樹葉,如果左側沒有就遍歷右側樹,這樣比我之前寫的需要對比每個樹的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)次。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章