2015-09-29 66 views
-1

我想實現發現的馬爾可夫算法here,但我一直未能。正如wiki解釋的那樣,它是一種遞歸函數,可以替換語言中的模式。例如如何在Java中實現馬爾可夫算法?

  • 「A」 - > 「蘋果」
  • 「B」 - > 「袋」
  • 「S」 - > 「商店」
  • 「T」 - > 「該」
  • 「的店鋪」 - >「我的兄弟」
  • 「一個從來沒有使用過」 - >「終止規則」

這些規則必須在下面的文字中實現。

「我從T S.買了B的As。

規則:

  1. 檢查規則,以便從上往下看是否有任何的 的模式可以在輸入字符串中被發現。
  2. 如果未找到,則算法停止。
  3. 如果找到一個(或多個),請使用其中的第一個替換 輸入字符串中匹配文本的最左邊匹配項,並將其替換爲 。
  4. 如果剛剛應用的規則是終止規則,則算法停止。
  5. 轉到步驟1

我想到了創建兩類規則RuleContainer

規則有3個屬性:從字符串,字符串要和布爾終止

RuleContainer具有含有活性規則和邏輯函數[該一個我試圖創建]的動態列表。

我已經考慮了String.replace()函數,並試圖將其實現爲遞歸函數。

實現馬爾可夫算法的最佳方式是什麼?

+0

SO是沒有免費的導師。請至少提供最少的代碼,我們可以從中開始。而一開始,它應該足以找到一種工作方式,之後你可以搜索最好的;-) – Marged

回答

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節省每次recompling的recglar表達式。

對於終止規則,如果匹配的規則是終止規則,則直接返回temp結果,而不進一步遞歸。