怎样优雅的研究 RGSS3 番外(一) ruby 实现的后缀自己主动机

*我真的不会 ruby 呀*

#encoding:utf-8
#==============================================================================
# ■ Suffix_Automaton
#------------------------------------------------------------------------------
#  后缀自己主动机。
#==============================================================================

class Suffix_Automaton
  #--------------------------------------------------------------------------
  # ● 定义实例变量
  #--------------------------------------------------------------------------
  attr_reader   :total                   # 当前 SAM 中不同的子串个数
  attr_reader   :root                    # SAM 的根节点
  #==============================================================================
  # ■ State
  #------------------------------------------------------------------------------
  #  后缀自己主动机的状态结点。
  #==============================================================================
  class State
    #--------------------------------------------------------------------------
    # ● 定义实例变量
    #--------------------------------------------------------------------------
    attr_accessor   :par                     # parent 树中的父结点
    attr_accessor   :go                      # go
    attr_accessor   :val                     # val
    #--------------------------------------------------------------------------
    # ● 初始化状态结点
    #--------------------------------------------------------------------------
    def init(val = 0)
      @par = nil
      @go = []
      @val = val
      for i in 0..26 do
        @go[i] = nil
      end
    end
    #--------------------------------------------------------------------------
    # ● 计算结点表示的不同子串数
    #--------------------------------------------------------------------------
    def calc
      return 0 if @par == nil
      return @val - @par.val
    end
  end
  #--------------------------------------------------------------------------
  # ● 初始化后缀自己主动机
  #--------------------------------------------------------------------------
  def initSAM
    @total = 0
    @cur = 0
    @nodePool = []
    @root = newState
    @last = @root
  end
  #--------------------------------------------------------------------------
  # ● 创建新的状态结点
  #--------------------------------------------------------------------------
  def newState(val = 0)
    @nodePool[@cur] = State.new
    @nodePool[@cur].init(val)
    @cur += 1
    return @nodePool[@cur-1]
  end
  #--------------------------------------------------------------------------
  # ● 加入字符
  #--------------------------------------------------------------------------
  def extend(w)
    p = @last
    np = newState(p.val + 1)
    while p != nil and p.go[w] == nil do
      p.go[w] = np
      p = p.par
    end
    if p == nil
      np.par = @root
      @total += np.calc # 统计
    else
      q = p.go[w]
      if p.val + 1 == q.val
        np.par = q
        @total += np.calc # 统计
      else
        nq = newState(p.val + 1)
        for i in 0..26 do
          nq.go[i] = q.go[i]
        end
        @total -= q.calc # 统计
        nq.par = q.par
        q.par = nq
        np.par = nq
        @total += q.calc + nq.calc + np.calc
        while p != nil and p.go[w] == q do
          p.go[w] = nq
          p = p.par
        end
      end
    end
    @last = np
  end
end  
时间: 2024-08-07 16:38:52

怎样优雅的研究 RGSS3 番外(一) ruby 实现的后缀自己主动机的相关文章

如何优雅的研究 RGSS3 番外(一) ruby 实现的后缀自动机

*我真的不会 ruby 呀* #encoding:utf-8 #============================================================================== # ■ Suffix_Automaton #------------------------------------------------------------------------------ # 后缀自动机. #============================

如何优雅的研究 RGSS3 番外(二) 显示文字信息的窗口中的纤程

Ruby 中的 Fiber 通常称为纤程,是一种非抢占式的多线程模型. 纤程不能在外部被终止,只能等待其主动让出执行权. RGSS3 在事件解释器 Game_Interpreter 与显示文字信息的窗口 Window_Message 中都用到了纤程. 以 Window_Message 为例. #-------------------------------------------------------------------------- # ● 更新画面 #-----------------

如何优雅的研究 RGSS3 (七) 添加LOGO画面

为游戏添加 LOGO 画面. 首先要设计 LOGO 场景类,我们知道场景类都是 Scene_Base 的子类. 我们来回顾一下场景的工作原理. 首先执行开始处理,接着是开始后处理,然后是不停的更新画面,最后结束前处理,然后结束处理. 下面来逐个分析这些方法. 当进入 LOGO 画面时,显然不需要也不可能回到上一个画面,因此在开始处理的方法中,我们要清空场景的切换记录. 接下来要创建出需要显示的 LOGO 图片,但是不能让它立即显示,而是要使其淡入画面,因此要冻结住图像的显示. 最后播放 LOGO

如何优雅的研究 RGSS3 (六) 技能与物品画面剖析

物品与技能画面剖析 物品画面和技能画面有共同的父类 Scene_ItemBase,而 Scene_ItemBase 继承自 Scene_MenuBase. Scene_ItemBase 在开始时用 create_actor_window 生成了显示角色的窗口备用. Scene_ItemBase 中定义了若干方法作为处理画面的工具. 其中 show_sub_window.hide_sub_window 可以显示.隐藏一个窗口. item.user用于获取选中的物品与使用者. on_actor_ok

如何优雅的研究 RGSS3 (五) 输入数字的画面

游戏中的名字输入画面是一个非常没有中国特色的场景. 我们知道英文不过26个字母,日语也只有几百个假名,但是汉字的数量实在是太多了,导致名字输入画面在汉化成中文版时只能用部分汉字来填充假名. 输入名字的功能并没有什么重要价值,但是这个功能实现的方法却值得我们研究. 游戏中有一个默认的输入数字的窗口,但是它非常不好用. 今天就来参照名字输入画面编写一个数字输入画面.用于玩家向游戏中输入数字. 涉及到名字输入画面的有三个类:Scene_Name.Window_NameEdit.Window_NameI

如何优雅的研究 RGSS3 (四) 使窗口从画面边缘弹出

在很多游戏中,窗口可以从游戏画面的边缘弹出. 而在 RGSS3 的默认脚本中时没有这种功能的,当在地图上按下取消键时,游戏菜单会突然出现. 现在我们可以为主菜单添加动画效果,使其在屏幕边缘弹出. 我们知道游戏中的画面并不是真正的在动,而是在每一帧都绘制一幅新的画面. 每一帧都对画面做一些微小的改变,在玩家的眼里就会产生画面在运动的错觉. 复杂的运动效果涉及到复杂的公式,这里我们只采用最简单的匀速直线运动. 我们为主菜单中的三个窗口添加匀速直线的运动规律,使其从画面的边缘移动到目标位置. @com

如何优雅的研究 RGSS3 (三) 调整窗口的细节

在上一期我们研究了向窗口中添加选项的方法,本期就来研究一下窗口类的具体细节. 所有窗口的父类 Window_Base 初始化时需要四个参数. #-------------------------------------------------------------------------- # ● 初始化对象 #-------------------------------------------------------------------------- def initialize(x,

【番外篇】关于多元线性回归以及主成成分分析的一点思考

前两天在研究期权组合问题,突然觉得对统计有了一点新的理解,所以今天写一点关于多元线性方面的东西,以待后用. 1. 多元线性回归的基本形式: 一个因变量,比如说某个地区的气温,被认为是由其他几个自变量,比如海拔.阳光亮度.湿度等等有关.我这里把这几个自变量理解为对应的instrument.假设有n次观测,那么得到的数据就是: 这里可以理解为在每次观测中,我们有Y这个Portfolio以及各个instrument对应的值.现在,我们就要找出这个Portfolio到底由对应的多少个instrument

编程珠玑番外篇

1.Plan 9 的八卦 在 Windows 下喜欢用 FTP 的同学抱怨 Linux 下面没有如 LeapFTP 那样的方便的工具. 在苹果下面用惯了 Cyberduck 的同学可能也会抱怨 Linux 下面使用 FTP 和 SFTP 是一件麻烦的事情. 其实一点都不麻烦, 因为在 LINUX 系统上压根就不需要用 FTP. 为什么呢? 因为一行简单的配置之后, 你就可以像使用本机文件一样使用远程的任何文件. 无论是想编辑, 查看还是删除重命名, 都和本机文件一样的用. 这么神奇的功能到底如何