• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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}"


    您可能感兴趣的文章:
    • Ruby实现的各种排序算法
    • Ruby实现的合并排序算法
    • Ruby实现的3种快速排序算法
    • Ruby一行代码实现的快速排序
    • ruby实现的插入排序和冒泡排序算法
    • Ruby实现的最长公共子序列算法
    • Ruby实现的最优二叉查找树算法
    • Ruby最简单的消息服务器代码
    • Ruby的字符串与数组求最大值的相关问题讨论
    上一篇:Ruby实现的最优二叉查找树算法
    下一篇:Ruby实现的最长公共子序列算法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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