程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> Ruby實現的最優二叉查找樹算法

Ruby實現的最優二叉查找樹算法

編輯:更多關於編程

       這篇文章主要介紹了Ruby實現的最優二叉查找樹算法,本文直接給出實現代碼,需要的朋友可以參考下

      算法導論上的偽碼改寫而成,加上導論的課後練習第一題的解的構造函數。

      代碼如下:

      #encoding: utf-8

      =begin

      author: xu jin

      date: Nov 11, 2012

      Optimal Binary Search Tree

      to find by using EditDistance algorithm

      refer to <>

      example output:

      "k2 is the root of the tree."

      "k1 is the left child of k2."

      "d0 is the left child of k1."

      "d1 is the right child of k1."

      "k5 is the right child of k2."

      "k4 is the left child of k5."

      "k3 is the left child of k4."

      "d2 is the left child of k3."

      "d3 is the right child of k3."

      "d4 is the right child of k4."

      "d5 is the right child of k5."

      The expected cost is 2.75.

      =end

      INFINTIY = 1 / 0.0

      a = ['', 'k1', 'k2', 'k3', 'k4', 'k5']

      p = [0, 0.15, 0.10, 0.05, 0.10, 0.20]

      q = [0.05, 0.10, 0.05, 0.05, 0.05 ,0.10]

      e = Array.new(a.size + 1){Array.new(a.size + 1)}

      root = Array.new(a.size + 1){Array.new(a.size + 1)}

      def optimalBST(p, q, n, e, root)

      w = Array.new(p.size + 1){Array.new(p.size + 1)}

      for i in (1..n + 1)

      e[i][i - 1] = q[i - 1]

      w[i][i - 1] = q[i - 1]

      end

      for l in (1..n)

      for i in (1..n - l + 1)

      j = i + l -1

      e[i][j] = 1 / 0.0

      w[i][j] = w[i][j - 1] + p[j] + q[j]

      for r in (i..j)

      t = e[i][r - 1] + e[r + 1][j] + w[i][j]

      if t < e[i][j]

      e[i][j] = t

      root[i][j] = r

      end

      end

      end

      end

      end

      def printBST(root, i ,j, signal)

      return if i > j

      if signal == 0

      p "k#{root[i][j]} is the root of the tree."

      signal = 1

      end

      r = root[i][j]

      #left child

      if r - 1< i

      p "d#{r - 1} is the left child of k#{r}."

      else

      p "k#{root[i][r - 1]} is the left child of k#{r}."

      printBST(root, i, r - 1, 1 )

      end

      #right child

      if r >= j

      p "d#{r} is the right child of k#{r}."

      else

      p "k#{root[r + 1][j]} is the right child of k#{r}."

      printBST(root, r + 1, j, 1)

      end

      end

      optimalBST(p, q, p.size - 1, e, root)

      printBST(root, 1, a.size-1, 0)

      puts "nThe expected cost is #{e[1][a.size-1]}."

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved