This algorithm est tellement avancée pour mes compétences de programmation de base que je ne vois pas comment je pourrais l'implémenter. Je poste ceci dans une nouvelle question parce que je ne peux pas continuer à déranger le type qui m'a donné l'algorithme seul à ce sujet dans la section de commentaire dans la question précédente.Java Besoin d'aide pour implémenter un algorithme
MaxSet(node) = 1 if "node" is a leaf
MaxSet(node) = Max(1 + Sum{ i=0..3: MaxSet(node.Grandchildren[i]) },
Sum{ i=0..1: MaxSet(node.Children[i]) })
Merci aussi mehrdad pour l'algorithme.
Le problème ici pour moi est de mettre en œuvre la partie des deux lignes de somme, comment puis-je faire cela? Et je dois marquer chaque noeud que cet algorithme choisit. C'est juste une variable "marquée" dans la classe de noeud définie sur true. Je ne comprends pas si elle prend une décision aussi choisir un nœud?
EDIT pour inclure mon code à ce jour:
public int maxSet(Posisjon<E> bt){
if (isExternal(bt)){
return 1;
}
return Math.max(1 + helper1(bt), helper2(bt));
}
private int helper1(Posisjon<E> node){
int tmp = 0;
if (hasLeft(node)){
if(hasLeft((Position<E>)node.leftChild())){
tmp += maxSet(node.leftChild().leftChild());
}
if(hasRight((Position<E>)node.leftChild())){
tmp += maxSet(node.leftChild().rightChild());
}
}
if(hasRight(node)){
if(hasLeft((Position<E>)node.rightChild())){
tmp += maxSet(node.leftChild().leftChild());
}
if(hasRight((Position<E>)node.rightChild())){
tmp += maxSet(node.leftChild().rightChild());
}
}
return tmp;
}
private int helper2(Posisjon<E> node){
int tmp = 0;
if(hasLeft(node)){
tmp +=maxSet(node.leftChild());
}
if(hasRight(node)){
tmp +=maxSet(node.rightChild());
}
return tmp;
}
Cela semble fonctionner, ce qui reste maintenant. Est-ce que pour marquer les noeuds comme choisis? Est-ce que je ferais ça?
Mise à jour avec le code:
public ArrayList<Posisjon<E>> getSelectionSet(Posisjon<E> bt, ArrayList<Posisjon<E>> s){
if(bt.marked){
s.add(bt);
}
if(hasLeft(bt)){
if(hasLeft(bt.leftChild())){
getSelectionSet(bt.leftChild().leftChild(),s);
}
if(hasRight(bt.leftChild())){
getSelectionSet(bt.leftChild().rightChild(),s);
}
}
if(hasRight(bt)){
if(hasLeft(bt.rightChild())){
getSelectionSet(bt.rightChild().leftChild(),s);
}
if(hasRight(bt.rightChild())){
getSelectionSet(bt.rightChild().rightChild(),s);
}
}
return s;
}
public int maxSet(Posisjon<E> bt){
if (bt.visited){
return bt.computedMax;
}
bt.visited = true;
int maxIfCurrentNodeIsSelected = 1 + helper1(bt);
int maxIfCurrentNodeIsNotSelected = helper2(bt);
if (maxIfCurrentNodeIsSelected > maxIfCurrentNodeIsNotSelected){
bt.marked = true;
bt.computedMax = maxIfCurrentNodeIsSelected;
}else{
bt.marked = false;
bt.computedMax = maxIfCurrentNodeIsNotSelected;
}
return maxSet(bt);
}
Après la soumission, je vais poster le code entier pour cela!
Il semble que vous demandiez simplement une solution complète. Je pense que vous obtiendrez de meilleures réponses si vous postez le code que vous avez essayé vous-même, et posez une question spécifique à ce sujet. –
Je vais nettoyer mon code un message plus tard si cela ne m'aide pas. Je viens d'utiliser deux fonctions d'aide comme les fonctions Sum. Ils sont énormes, car je dois aussi vérifier que les nœuds ne sont pas nuls. Et la partie sur la façon de stocker l'ensemble, aurais-je marquer les nœuds comme choisis? Vous pouvez simplement le signaler dans l'algorithme Pseudo. – Algific
Mis à jour avec mon code jusqu'à présent. Il semble fonctionner avec compter le maximum et retourner un int. Seulement testé sur un arbre avec trois éléments durs. Étiquetterais-je les nœuds comme choisis? – Algific