2017-08-05 3 views
0

im travaillant sur un projet et dans mon projet, je dois construire un arbre. L'arbre aura environ 64000 feuilles. Malheureusement, je continue à courir dans une erreur de stackoverflow et je n'ai aucune idée de ce qu'il faut faire à ce stade. Ai-je mal écrit ma méthode récursive ou existe-t-il une solution de contournement pour l'erreur? code dans le constructeur:bâtiment et arbre énorme et étant mis sur écoute avec une erreur stackoverflow

for(int i = 0; i < wordHolder.size(); i++) { 
      add(i); 
     } 

méthode Add:

public void add(int i){ 
     mainTreeNode = treeSetup(mainTreeNode, 0, wordHolder.get(i), countHolder.get(i)); 
    } 

et la méthode récursive qui met en place l'arbre:

private TreeNode treeSetup(TreeNode node, int letterCount, String s, List<Integer> i) { 
     if(letterCount == 26) { 
      letterCount = 0; 
     } 
     if(node == null) { 
      node = new TreeNode(s,i); 
     } else if (i.get(letterCount) >= node.test.get(letterCount)) { 
      node.right = treeSetup(node.right, letterCount++, s, i); 
     } else if(i.get(letterCount) < node.test.get(letterCount)) { 
      node.left = treeSetup(node.left, letterCount++, s, i); 
     } 
     return node; 
    } 

Le nœud est un nœud standard qui contient 2 structures de données (une liste et une chaîne). L'idée est que le noeud est placé dans un endroit basé sur ce que la liste contient. De plus, chaque niveau de l'arbre est vérifié en fonction d'une valeur différente de la liste (comme un arbre KD), d'où la variable letterCount. le problème semble être dans la ligne

node.right = treeSetup(node.right, letterCount++, s, i);` 

mais les changements en fonction de quel que soit « instruction if » a le signe « = ». Si je supprime le signe « = » à la fois « si les déclarations » le problème disparaît, mais je perds une énorme quantité de accuracy.` S'il vous plaît aider

Répondre

0

Ce Java? Vous n'avez pas spécifié mais ça ressemble à ça. Mis à part les problèmes de bonnes pratiques, une chose que je vois est 2 sinon si, si vous devez faire si c'est le cas si sinon si pour Java. Cependant, un changement de cas pourrait être meilleur pour cette étude.

Le constructeur doit avoir pour les boucles en elle. Un constructeur devrait être un plan que vous appelez pour construire votre instance d'un objet. Il a juste toutes les références et informations pour vous donner un squelette. Ensuite, vous utilisez d'autres méthodes pour lui donner de la chair.

Personnellement première chose que je voudrais essayer est de rendre le treeNode treeSetup plus comme un initialiseur pour l'instance du constructeur. Laissez-le prendre des paramètres et passez-les à l'instance d'objet qui en aura besoin pour définir son unicité. Placez la boucle for à l'intérieur de la méthode void, construisez votre Params pour passer à la méthode Treenode à l'intérieur du vide, puis passez toutes les informations, et laissez-le définir tous les goodies pour vous.

pour le réglage des nœuds lui-même il y a de meilleures façons de le faire, mais rapide et sale

if (letterCount == 26) { 
letterCount = 0; 
} 
if (node != null) { 
if (letterCount %2 == 0) { 
do left stuff 
} else { 
do right stuff 
} 
} 
return 

autre si des œuvres mais honnêtement si vous pouvez trouver un moyen d'utiliser un boîtier ENUM ou commutateur, beaucoup plus moderne. Une autre chose que vous devriez regarder, vous est utilisé 2 types de données d'une manière étrange, il existe déjà un élément parfait pour 2 types de données contenant une clé et une valeur.

https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html

+0

Mais pour moi noway theres pour résoudre ce problème stackoverflow? –

+0

Aussi, je dois utiliser un arbre kd, le problème est beaucoup plus grand et l'arbre kd est le moyen de le résoudre (sa similarité est basée) –