簡體   English   中英

該算法是否已正確實施?

[英]Has this algorithm been implemented properly?

我目前正在實施BK樹來進行拼寫檢查。 我正在使用的詞典非常大(數以百萬計的單詞),這就是為什么我根本無法承受任何低效率的原因。 但是,我知道我編寫的查找功能(可以說是整個程序中最重要的部分)可以做得更好。 我希望就此找到一些幫助。 這是我寫的查詢:

public int get(String query, int maxDistance)
{
    calculateLevenshteinDistance cld = new calculateLevenshteinDistance();
    int d = cld.calculate(root, query);
    int tempDistance=0;

    if(d==0)
        return 0;

    if(maxDistance==Integer.MAX_VALUE)
        maxDistance=d;

    int i = Math.max(d-maxDistance, 1);
    BKTree temp=null;

    for(;i<=maxDistance+d;i++)
    {
        temp=children.get(i);
        if(temp!=null)
        {
            tempDistance=temp.get(query, maxDistance);
        }
        if(maxDistance<tempDistance)
            maxDistance=tempDistance;
    }

    return maxDistance;
}

我知道我正在不必要地運行循環很多次,並且我們可以調整搜索空間以使查找更快。 我只是不確定如何最好地做到這一點。

如果有點拜占庭,您的循環看起來通常是正確的。 您嘗試細化停止條件(具有tempdistance / maxdistance)的嘗試是錯誤的,但是:BK樹的結構要求您探索levenshtein距離dk到當前節點的d + k的所有節點。結果,所以您不能像這樣修剪。

是什么讓您覺得自己在探索太多的樹?

您可能會在Levenshtein Automata上找到我的后續文章,因為它們比BK樹更有效。 但是,如果您要構建拼寫檢查器,我建議您遵循Favonius的建議,並查看有關如何編寫該文章的文章 比天真的字符串距離檢查更適合於拼寫更正。

暫無
暫無

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

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