Ruby实现的最短编辑距离计算方法

   这篇文章主要介绍了Ruby实现的最短编辑距离计算方法,本文直接给出实现代码,需要的朋友可以参考下

  利用动态规划算法,实现最短编辑距离的计算。

   代码如下:

  #encoding: utf-8

  #author: xu jin

  #date: Nov 12, 2012

  #EditDistance

  #to find the minimum cost by using EditDistance algorithm

  #example output:

  # "Please input a string: "

  # exponential

  # "Please input the other string: "

  # polynomial

  # "The expected cost is 6"

  # The result is :

  # ["e", "x", "p", "o", "n", "e", "n", "-", "t", "i", "a", "l"]

  # ["-", "-", "p", "o", "l", "y", "n", "o", "m", "i", "a", "l"]

  p "Please input a string: "

  x = gets.chop.chars.map{|c| c}

  p "Please input the other string: "

  y = gets.chop.chars.map{|c| c}

  x.unshift(" ")

  y.unshift(" ")

  e = Array.new(x.size){Array.new(y.size)}

  flag = Array.new(x.size){Array.new(y.size)}

  DEL, INS, CHA, FIT = (1..4).to_a #deleat, insert, change, and fit

  def edit_distance(x, y, e, flag)

  (0..x.length - 1).each{|i| e[i][0] = i}

  (0..y.length - 1).each{|j| e[0][j] = j}

  diff = Array.new(x.size){Array.new(y.size)}

  for i in(1..x.length - 1) do

  for j in(1..y.length - 1) do

  diff[i][j] = (x[i] == y[j])? 0: 1

  e[i][j] = [e[i-1][j] + 1, e[i][j - 1] + 1, e[i-1][j - 1] + diff[i][j]].min

  if e[i][j] == e[i-1][j] + 1

  flag[i][j] = DEL

  elsif e[i][j] == e[i-1][j - 1] + 1

  flag[i][j] = CHA

  elsif e[i][j] == e[i][j - 1] + 1

  flag[i][j] = INS

  else flag[i][j] = FIT

  end

  end

  end

  end

  out_x, out_y = [], []

  def solution_structure(x, y, flag, i, j, out_x, out_y)

  case flag[i][j]

  when FIT

  out_x.unshift(x[i])

  out_y.unshift(y[j])

  solution_structure(x, y, flag, i - 1, j - 1, out_x, out_y)

  when DEL

  out_x.unshift(x[i])

  out_y.unshift('-')

  solution_structure(x, y, flag, i - 1, j, out_x, out_y)

  when INS

  out_x.unshift('-')

  out_y.unshift(y[j])

  solution_structure(x, y, flag, i, j - 1, out_x, out_y)

  when CHA

  out_x.unshift(x[i])

  out_y.unshift(y[j])

  solution_structure(x, y, flag, i - 1, j - 1, out_x, out_y)

  end

  #if flag[i][j] == nil ,go here

  return if i == 0 && j == 0

  if j == 0

  out_y.unshift('-')

  out_x.unshift(x[i])

  solution_structure(x, y, flag, i - 1, j, out_x, out_y)

  elsif i == 0

  out_x.unshift('-')

  out_y.unshift(y[j])

  solution_structure(x, y, flag, i, j - 1, out_x, out_y)

  end

  end

  edit_distance(x, y, e, flag)

  p "The expected edit distance is #{e[x.length - 1][y.length - 1]}"

  solution_structure(x, y, flag, x.length - 1, y.length - 1, out_x, out_y)

  puts "The result is : n #{out_x}n #{out_y}"

时间: 2024-11-02 16:06:37

Ruby实现的最短编辑距离计算方法的相关文章

Ruby实现的最短编辑距离计算方法_ruby专题

利用动态规划算法,实现最短编辑距离的计算. 复制代码 代码如下: #encoding: utf-8 #author: xu jin #date: Nov 12, 2012 #EditDistance #to find the minimum cost by using EditDistance algorithm #example output: #  "Please input a string: " #  exponential #  "Please input the

算法:CodeForces #196(Div. 2) 337D Book of Evil(树形dp)

题意 给一棵n个结点的树,任意两个节点的距离是指连接两点的最短的边数 在树上的某个结点 有一个"恶魔之书",这本书会让距离它d以内的节点都受到影响 已知有m个节点收到了影响,问最多有几 个结点可能放着"恶魔之书"? 思路 要判断某个点是不是放着书,就要判断这个点的周围d距离以 内是否包含所有受影响的m节点 而如果某个节点距离最远的那个受影响节点的距离是L,如果L <= d,那 么说明所有受影响的m节点都在d以内,就可判断这个点可能放着书 那么,我们只要能够求出

性能测试-文本相似度分析的性能检测?

问题描述 文本相似度分析的性能检测? 利用tf-idf算法和余弦相似度算法计算了文本之间的相似度,可是结果出来了,不知道结果的好坏啊,请问大神们有没有知道怎么评测结果的好坏啊? 解决方案 分析算法复杂度.如果算法太复杂,分析起来有困难,评价算法的好坏就是给数据量大小不等的测试样本,运行得到耗费的时间. 对数据量和运行时间的曲线拟合. 糟糕的算法就是随着数据量的增加,时间或者存储的开销呈现几何级数地发散出去. 好的算法是,时间随着数据的增加,呈现常数.收敛在某个值或者是线性增加的. 解决方案二:

JAVA中获取两个字符串差异的方法

问题描述 JAVA中获取两个字符串差异的方法 求助,在编程的过程中碰到这样一个问题,有两个String字符串,然后我需要获取他们之间的差异 String s = {"12345"}; String s1 ={"123645"}; 其中这两个数组的长度可变,s是模板,所有的数组都要和这个数组比较,然后把差异的部分获取出来 所以s1可以是缺了一两个元素的数组,仅仅是单个的字符被替换了,这个可以简单的用字符数组一个一个比较获得,但是如果多一个,或者少一个,这一块我就有点不

list-java List相似元素比较

问题描述 java List相似元素比较 需要比较List集合中相似的内容,比如 ```List.add(""***获取腾讯领投100万元投资"")已经判断成功为相似数据但是List里面内容比较的方式不会...求教! 解决方案 你起码应该说清楚什么叫相似数据,你是怎么定义的. 解决方案二: 比如说,你可以通过计算两个字符串的最短编辑距离求它们的相似性.google 最短编辑距离算法 解决方案三: 数据判断代码判断什么

第一个Ruby On Rails项目

网站开发讲究的是效率,能把一个创意在最短的时间内实现,往往容易占得先机.尽管Ruby On Rails 的开发效率很高,但是如果每次开发网站都需要从头做起注册.登录.权限管理.忘记密码这些繁琐的基 础功能,实在不是一件愉快的事.下面这些代码能够让我们直接关注网站的逻辑实现,而不是繁琐的基本 功能. restful_authentication_tutorial http://github.com/activefx/restful_authentication_tutorial/tree/mast

Ruby的类变量和类方法

象大多数面向对象语言一样,Ruby类也允许定义类变量和方法.一个类变量允许在一个类的所有实例间共享单个变量.在Ruby中,两个@@号用于指示类变量.例如,如果你想要使一个BankAccount类的所有实例共享相同的利息率,那么该类可能被如下定义: class BankAccount @@interestRate = 6.5 def BankAccount.getInterestRate() @@interestRate end attr_accessor :balance def initial

ruby存取器的概念

什么是一个存取器? 我们在前面已经讨论过实变量了,但却未过多的讨论.一个对象的实变量属于它的属性,也是它与其它来自同一个类的对象的一般区别.读写它的属性是重要的;这样做需要做一个叫着属性存取器(attribute accessors)的方法.我们将很快看到我们并不是总要明确地写出存取器方法,但现在先让我们了解所有的细节.存取器的两种类型是写(writer)和读(reader). ruby> class Fruit | def set_kind(k) # a writer | @kind = k

利用Ruby简化你的Java测试(进阶篇)

本文是Productive Java with Ruby系列文章的第二篇,通过上一篇的介绍,我想大家对如何利用Ruby进行单元测试有了一个基本的了解,从这里开始,我将和大家一起讨论一些利用Ruby进行单元测试时的高级话题. 通常,新技术的引入只能降低解决问题的难度,而不是消除问题本身! 在"依赖"的原始丛林中挣扎... 通过Ruby我们可以更高效的处理数据准备的问题,但是真实的世界并不那么简单!随着测试的深入,我们会越发的感觉一不小心就挣扎在"依赖"的原始丛林中!有