簡體   English   中英

java-加速遞歸函數

[英]java - Speed up recursive function

我正在研究此拼寫檢查器,我用來向用戶建議更正的方法之一是在單詞中插入多個字符。 這允許將諸如exmpl類的exmpl更正為example這是實際的代碼:

public static Set<String> multiInsert(String word, int startIndex) {
    Set<String> result = new HashSet<>();

    //List of characters to insert
    String correction = "azertyuiopqsdfghjklmwxcvbnùûüéèçàêë";

    for (int i = startIndex; i <= word.length(); i++) {
        for (int j = i + 1; j <= word.length(); j++) {
            for (int k = 0; k < correction.length(); k++) {
                String newWord = word.substring(0, j) + correction.charAt(k) + word.substring(j);

                result.addAll(multiInsert(newWord, startIndex + 2));

                if(dico.contains(newWord)) result.add(newWord);
            }
        }
    }

    return result;
}

此功能的問題在於,處理該單詞需要花費很多時間,尤其是當單詞較長或我要糾正的單詞過多時。 有沒有更好的方法來實現或優化此功能?

變慢的原因是您正在測試不在字典中的字符串。 比字典中的單詞有更多可能的拼寫錯誤。 您需要以字典為指導。

這是一般的拼寫糾正問題。 我已經編程了好幾次了

簡而言之,該方法是將字典存儲為Trie,並進行Trie的有界深度優先遍歷。 在每一步中,您都將跟蹤Trie中的單詞與原始單詞之間的距離。 只要該距離超出范圍,就可以修剪搜索。

因此,您需要循環執行,每次都增加邊界。 首先,您以0為界進行操作,因此它只會找到完全匹配的內容。 這相當於普通的特里搜索。 如果沒有得到匹配,則以1的界限再次進行遍歷。這將找到與原始單詞相距1的所有詞典單詞。 如果沒有任何結果,請將邊界增加到2,依此類推。 (構成距離增量的是您選擇的任何變換,例如插入,刪除,替換或更一般的重寫。)

性能受真實距離乘以字典大小的限制。 缺少這一點,它在真實距離中是指數的。 由於每次步行的費用是前一次步行的倍數,因此時間受最終步行的支配,因此先前的步行不會增加太多時間。

將字典組織為特里字典是有好處的,因為特里字典只是有限狀態機的一種特殊形式。 您可以向其添加子機來處理常見的前綴和后綴,而無需大量擴展字典。 考慮一下這些詞:民族,民族,民族主義,民族主義,民族主義,民族主義……。這些詞可能並不常見,但並非不可能。 帶有后綴的trie可以輕松處理它們。 類似的前綴,例如前置,后置,取消,取消,輸入等。

您可以看看Jazzy ,它是Java拼寫檢查器API。

您可能還需要考慮模糊字符串匹配

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM