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]}."

时间: 2024-07-30 12:36:43

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 <<introduction to algorithms>> example output: "k2 is the r

【算法导论】动态规划之最优二叉查找树

        如果我们想写一个单词查询的软件的话,我们的目的就是让查询的总时间最短,我们首先想到用之前的二叉查找树.我们可以用红黑树或者其它的平衡二叉树来保证每个单词的搜索时间.但是每个单词出现的频率一般不同,因此我们希望把频率较大的单词放在离根比较近的地方,频率较小的放在离叶子较近的地方.而且,我们所要查询的单词词库中没有,这也值得考虑.                        由上文可知,ki表示单词,di表示不能查到的情况.由上面的例子可知,一棵最优二叉树不一定是高度最小的树.我们

Ruby实现的3种快速排序算法

  这篇文章主要介绍了Ruby实现的3种快速排序算法,本文给出了快速排序的普通版本.快速排序的随机化版本.快速排序的利用了Ruby的语法糖的随机化版本三个版本,需要的朋友可以参考下 刚学Ruby,正巧算法老师鼓励用不熟悉的语言来写算法,我就用Ruby吧~~ 话说Ruby可真是超厉害,好多凭直觉的方法都可以用.....无限膜拜中.... 期间我遇到了invalid multibyte char (US-ASCII)的错误,解决办法是在开头加一个#encoding:utf-8 这个错误在stacko

Ruby实现的矩阵连乘算法

  这篇文章主要介绍了Ruby实现的矩阵连乘算法,本文直接给出实现代码,需要的朋友可以参考下 动态规划解决矩阵连乘问题,随机产生矩阵序列,输出形如((A1(A2A3))(A4A5))的结果. 代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 5

退火算法-java最优组合算法问题,编程实现字母最优组合生成最优解

问题描述 java最优组合算法问题,编程实现字母最优组合生成最优解 要求:输入A~K中的任意几个字母(无重复),对这些字母进行组合.输出最优组合的最小组数n和组合方案,使用java语言. 约束条件:A可以和B一组: A可以和E.F.G一组: C.D.H要单独分组: I可以和E.F.G一组: J可以和E.F.G一组: K可以和E.F.G一组: 如果可以,希望用退火算法的思想来解决本问题.毕设赶着要用这个算法,希望尽快提供解决方案,拜谢! 解决方案 两两组合,还是可以多个组合? 解决方案二: 必须是

求解acm题目,一直时间超限,求更优的算法

问题描述 求解acm题目,一直时间超限,求更优的算法 #include<cstdio> #include<cstring> int v[10000]; int a[10000]; int s; int check(int k) { for(int i=0;i<s;i++) if(k == a[i]) return 0; return 1; } void dfs(int t,int n,int k) { if(n==0){ if(check(k)){ a[s++] = k; /

物联网协调的电动汽车快速充电最优预约算法

物联网协调的电动汽车快速充电最优预约算法 蒲勇健 电动汽车是未来社会经济可持续发展的必然选择,也是新能源汽车发展的主流方向.充电问题是电动汽车发展普及的重要技术障碍.为提高快速充电的效率,提出了一种有序充电的优化预约算法.给定一组发出快速充电申请的电动汽车,将实现不同的电动汽车与不同的充电站进行最优预约匹配,以确保最大数量的电动汽车能够在同一时段内成功预约到某个充电站.本算法解决的是避免排长队等待的问题,同时也是解决运筹学中一类配对问题的算法,该算法的有效性通过定理予以了证明. 物联网协调的电动

最优二叉树算法

练习做一下构造最优二叉树的算法,不过如何计算WPL呢? 本次未能实现,希望懂的人可以帮我解决一下这个问题,不胜感激! // // 头文件:HuffmanTree.h // // 叶子结点的最大数量 #define LEAVES_COUNT 4 // // 二叉树的最大结点总数 #define NODES_COUNT (2 * LEAVES_COUNT - 1) // // 哈夫曼树的结点结构体 typedef struct tagHuffmanTreeNode { float weight; /

请牛人指点,如何以最优的算法,对两点间的距离进行排序。

问题描述 业务要求:根据APP当前位置,取得距离最近的10条记录,再次刷新时,取得后10条最近的数据...我考虑的思路:■思路1:查询出数据库中所有的数据,根据两点的经度和纬度计算得到距离.再按照距离排序.缺点是,如果数据库有100万条数据,每次取出来,效率会很慢.■思路2:SQL查询语句中,取得两点间,经度和纬度差值的绝对值,以从小到大排序,取得前10条即可.这样查出来的数据量就比较小了.正确的思路到底是什么呢,不知道别人的APP距离排序怎么个算法.★Java算法是什么呢??★APP客户端传递