如何在Java中实现马尔可夫算法?

时间:2015-09-29 04:00:48

标签: java algorithm recursion substitution markov

我想实现马尔科夫的算法here,但我还没能做到。正如维基解释的那样,它是一种递归函数,可替代语言中的模式。例如

  • " A" - > "苹果"
  • " B" - > "袋"
  • " S" - > "店"
  • " T" - > "所述"
  • "商店" - > "我的兄弟"
  • "一个从未使用过的" - > 。"终止规则"

这些规则必须在以下文字中实施:

  

"我从T S买了一个B of。"

规则:

  1. 按顺序检查规则从上到下查看是否有任何 模式可以在输入字符串中找到。
  2. 如果未找到,则算法停止。
  3. 如果找到一个(或更多),请使用第一个替换 输入字符串中最左边出现的匹配文本 更换。
  4. 如果刚刚应用的规则是终止规则,则算法会停止。
  5. 转到第1步。
  6. 我考虑创建两个类规则 RuleContainer

    规则有3个属性:String from,String To和Boolean terminateating

    RuleContainer 有一个包含活动规则和逻辑函数的动态列表[我是一个'试图创造]。

    我已经考虑了String.replace()函数,并尝试将其实现为递归函数。

    实施马尔可夫算法的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

忽略终止规则部分一秒钟,递归函数的基本形状如下:

String markov(String input, List<Rule> rules) {

  // find the first matching rule, apply it and recurse 
  for (Rule rule : rules) {
    if (rule.matches(input)) {
      String temp = rule.apply(input);
      return markov(temp, rules);
    }
  }

  // no rule matched so just return the input text
  // - this is the terminating case for the recursion
  return input;
}

这将继续调用自己,直到没有规则匹配当前输入字符串,此时它将展开将结果一直返回到调用堆栈。您只需将以下方法添加到Rule类:

public boolean matches(String input) { ... }
public String apply(String input) { ... }

这些可能只是简单的String函数(containsreplaceFirst等),或者您可以使用java.util.regex.Patternjava.util.regex.Matcher来保存重新计算recglar每次表达。

对于终止规则,如果匹配的规则是终止规则,则直接返回temp结果,而不再进一步递归。