Ruby实现的最优二叉查找树算法
算法导论上的伪码改写而成,加上导论的课后练习第一题的解的构造函数。
代码如下:
#encoding: utf-8 =begin author: xu jin date: Nov 11, 2012 Optimal Binary Search Tree to find by using EditDistance algorithm refer to <<introduction to algorithms>> 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]}."
相关推荐
koushr 2020-11-12
jimeshui 2020-11-13
faiculty 2020-08-20
数据与算法之美 2020-07-04
xhao 2020-06-29
wuxiaosi0 2020-06-28
路漫 2020-06-28
数据与算法之美 2020-06-28
田有朋 2020-06-28
xhao 2020-06-28
natloc 2020-06-27
leoaran 2020-06-22
算法改变人生 2020-06-09
nurvnurv 2020-06-07
shenwenjie 2020-06-04
Tips 2020-06-03
只能做防骑 2020-06-01
yuanran0 2020-05-13