Ruby实现的最长公共子序列算法

 更新时间:2015年05月22日 11:22:16   投稿:junjie  
这篇文章主要介绍了Ruby实现的最长公共子序列算法,本文直接给出实现代码,需要的朋友可以参考下

最长公共子序列,LCS,动态规划实现。

#encoding: utf-8
#author: xu jin, 4100213
#date: Nov 01, 2012
#Longest-Commom-Subsequence
#to find a longest commom subsequence of two given character arrays by using LCS algorithm
#example output:
#The random character arrays are: ["b", "a", "c", "a", "a", "b", "d"] and ["a", "c", "a", "c", "a", "a", "b"]
#The Longest-Commom-Subsequence is: a c a a b

chars = ("a".."e").to_a
x, y = [], []
1.upto(rand(5) + 5) { |i| x << chars[rand(chars.size-1)] }
1.upto(rand(5) + 5) { |i| y << chars[rand(chars.size-1)] }
printf("The random character arrays are: %s and %s\n", x, y)
c = Array.new(x.size + 1){Array.new(y.size + 1)}
b = Array.new(x.size + 1){Array.new(y.size + 1)}

def LCS_length(x, y ,c ,b) 
   m, n = x.size, y.size
   (0..m).each{|i| c[i][0] = 0}
   (0..n).each{|j| c[0][j] = 0}
   for i in (1..m) do
    for j in(1..n) do
    if(x[i - 1] == y [j - 1])
     c[i][j] = c[i - 1][j - 1] + 1;
     b[i][j] = 0
    else
     if(c[i - 1][j] >= c[i][j - 1])
      c[i][j] = c[i - 1][j]
      b[i][j] = 1
     else
      c[i][j] = c[i][j - 1]
      b[i][j] = 2
     end
    end
   end
   end
end

def Print_LCS(x, b, i, j)
  return if(i == 0 || j == 0)
  if(b[i][j] == 0)
    Print_LCS(x, b, i-1, j-1)
    printf("%c ", x[i - 1])
  elsif(b[i][j] == 1)
    Print_LCS(x, b, i-1, j)
  else
    Print_LCS(x, b, i, j-1)
  end
end

LCS_length(x, y, c ,b) 
print "The Longest-Commom-Subsequence is: "
Print_LCS(x, b, x.size, y.size)

相关文章

  • Ruby on Rails所构建的应用程序基本目录结构总结

    Ruby on Rails所构建的应用程序基本目录结构总结

    Ruby on Rails是Ruby世界中一家独大的Web开发框架,要掌握Rails程序的构建,对其目录结构的了解十分必要,下面就来看一下Ruby on Rails所构建的应用程序基本目录结构总结
    2016-05-05
  • Rails Routes中new、collection、member的区别浅析

    Rails Routes中new、collection、member的区别浅析

    这篇文章主要介绍了Rails Routes中new、collection、member的区别浅析,本文先是对这3个自定义路由参数做了讲解,然后总结了它的们的区别,需要的朋友可以参考下
    2015-01-01
  • Ruby使用C++扩展实例(含C++扩展代码示例)

    Ruby使用C++扩展实例(含C++扩展代码示例)

    这篇文章主要介绍了Ruby使用C++扩展实例,含C++扩展实现代码,本文可作为Ruby中使用C++扩展的入门教程,需要的朋友可以参考下
    2014-09-09
  • ruby 杂项

    ruby 杂项

    ruby 杂项...
    2007-11-11
  • ruby中的双等号==问题详解

    ruby中的双等号==问题详解

    Ruby里面有4种比较方法,equal?, eql?, ==, ===,而且在不同的类里面表现的很不一样。在使用的时候也特别容易搞糊涂。 本文先给大家讲述一下==号的用法及使用中应该注意的地方
    2016-02-02
  • 在Ruby中查找和执行方法

    在Ruby中查找和执行方法

    这篇文章主要介绍了在Ruby中查找和执行方法,是Ruby入门学习中的基础知识,需要的朋友可以参考下
    2015-07-07
  • Ruby信号处理详解

    Ruby信号处理详解

    这篇文章主要介绍了Ruby信号处理详解,包含了Ruby使用Process.kill发送信号,Ruby使用trap()设置信号处理程序等需要的朋友可以参考下
    2022-04-04
  • Ruby中执行Linux shell命令的六种方法详解

    Ruby中执行Linux shell命令的六种方法详解

    这篇文章主要介绍了Ruby中执行Linux shell命令的六种方法详解,这些方法包括exec、system、反引号、IO、Open3、Open4等命令,需要的朋友可以参考下
    2015-01-01
  • mac os gem安装json出现error failed的解决办法

    mac os gem安装json出现error failed的解决办法

    这篇文章主要介绍了mac os gem安装json出现error failed的解决办法,系统是mac os Mavericks,失败提示Failed to build gem native extension,需要的朋友可以参考下
    2014-06-06
  • Ruby版本管理工具RVM的安装和使用教程

    Ruby版本管理工具RVM的安装和使用教程

    这篇文章主要介绍了Ruby版本管理工具RVM的安装和使用教程,本文示例基于类Unix的系统环境,需要的朋友可以参考下
    2015-08-08

最新评论