2010-10-05 8 views
0

Je suis exécute actuellement un BK-Tree pour faire un correcteur orthographique. Le dictionnaire avec lequel je travaille est très volumineux (des millions de mots), ce qui explique pourquoi je ne peux me permettre aucune inefficacité. Cependant, je sais que la fonction de recherche que j'ai écrite (sans doute la partie la plus importante de tout le programme) peut être améliorée. J'espérais trouver de l'aide concernant la même chose. Voici la recherche que j'ai écrit:Cet algorithme a-t-il été implémenté correctement?

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; 
} 

Je sais que je courais la boucle un nombre inutilement grand nombre de fois et que nous pouvons réduire l'espace de recherche pour accélérer la recherche. Je ne suis pas sûr de savoir comment faire mieux.

+2

@Mitch - Cela peut être vrai ... mais les gens ne répondant sous prétexte d'être accepté commence à être un peu vieux. Les gens ne devraient-ils pas répondre pour être utile? –

+0

@efficiencyIsBliss - Je réponds aux questions parce que j'ai besoin que mes réponses soient acceptées. Bonne chance avec celui-ci. – IVlad

+4

@Justin, je comprends d'où tu viens. Mais je pense qu'un argument sain peut être avancé qu'il est bon, du point de vue du bassin de connaissances communales, d'encourager les citoyens à s'engager dans les meilleures pratiques. Une question avec une réponse-cochée est plus utile pour le googleur aléatoire qui arrive sur SO que l'un sans une telle réponse. –

Répondre

1

Votre boucle semble généralement correcte, si un peu Byzantin. Votre tentative d'affiner la condition d'arrêt (avec tempdistance/maxDistance) est incorrect, cependant: la structure du BK-arbre exige que vous explorez tous les noeuds dk distance levenshtein à d + k du noeud courant si vous voulez trouver tous les résultats, de sorte que vous ne pouvez pas l'élaguer comme ça.

Ce que vous fait penser que vous explorez trop de l'arbre?

Vous pourriez trouver mon post sur L evenshtein Automata suivi instructifs, car ils sont plus efficaces que les BK arbres. Si vous construisez un vérificateur d'orthographe, cependant, je recommande de suivre la suggestion de Favonius et de vérifier this article sur la façon d'en écrire un. Il est beaucoup mieux adapté à la correction d'orthographe qu'une vérification naïve de la distance entre cordes.

+0

J'étais conscient de la partie d-k à d + k et je l'ai implémentée, mais ça m'a donné des résultats incorrects, c'est pourquoi je m'en suis complètement débarrassé. C'est pourquoi j'étais si sûr de ne pas réduire efficacement l'espace de recherche. Pourriez-vous expliquer cette partie un peu plus ici? Est-ce que d et k restent constants ou changent-ils à chaque itération dans l'arbre? – efficiencyIsBliss

+0

'k' est le seuil, et reste constant. 'd' est la distance entre le terme recherché et le noeud courant, et dépend du noeud que vous évaluez. –

+0

Pour réduire l'espace de recherche, pouvons-nous changer k pour refléter la distance minimale trouvée jusqu'ici? Si nous savons que le premier mot que nous avons regardé était à une distance de 5 de notre mot, alors il ne sert à rien de regarder des mots qui peuvent être à une distance de 6 ou plus, n'est-ce pas? – efficiencyIsBliss