Implémenter le tas à l'aide d'un arbre binaire
Cette question a été posée dans la Pile d'Échange, mais elle est restée sans réponse.
Lien à la déjà posé la question:
Tas binaire, mis en œuvre par l'intermédiaire d'un Arbre Binaire de la Structure
Comment puis-je mettre en œuvre des tas dans un arbre binaire. Pour mettre en œuvre un segment, il est important de connaître les dernières rempli nœud et le premier inoccupé nœud. Cela pourrait être fait au niveau de la commande de l'arbre, mais la complexité du temps O(n) pour trouver la première inoccupé nœud. Alors, comment mettre en œuvre des tas dans un arbre binaire en O(logn)?
Merci
Shekhar
source d'informationauteur user2200660
Vous devez vous connecter pour publier un commentaire.
À mettre en œuvre un tas avec un arbre binaire O(log n) le temps de la complexité, vous avez besoin pour stocker le nombre total de nœuds comme une variable d'instance.
Supposons que nous avons eu un tas de 10 nœuds.
Si nous devions ajouter un nœud...
On incrémente le nombre total de nœuds par un. Maintenant, nous avons 11 total des nœuds. Nous convertissons le nouveau nombre total de nœuds (11) à sa représentation binaire: 1011.
Avec la représentation binaire du total des nœuds (1011), nous nous débarrassons du premier chiffre. Par la suite, nous utilisons 011 pour naviguer dans l'arbre à l'emplacement suivant pour insérer un nœud. 0 signifie que pour aller à gauche et 1 signifie que pour aller à droite. Donc, avec 011, nous allons à gauche, allez à droite, et allez à droite...ce qui nous amène à la prochaine emplacement pour insérer dans.
Nous avons examiné un noeud par niveau, ce qui rend le temps de complexité O(log n)
TAS DE MISE EN ŒUVRE À L'AIDE DE L'ARBORESCENCE DE
Je réponds à ma propre question qui prend O(log n), mais la limitation est de garder un pointeur vers le parent. si nous ne gardons pas un pointeur vers le parent, nous avons besoin d'environ O(n). J'ai posté cette question afin d'obtenir une solution de O(log n)
Ici sont les étapes pour calculer les prochains inoccupé de la feuille (nous avons un pointeur vers le nœud parent):
C'est O(log n), mais a besoin d'un pointeur vers le parent.
O(n) solution serait assez facile, il suffit de niveau de l'ordre de l'arbre et nous obtenons le lieu de la prochaine inoccupé nœud.
Ma question est: comment localiser prochaine inoccupé nœud en O(log n) sans l'aide d'un parent pointeur.
Grâce.
En supposant que vous souhaitez utiliser un lié arbre binaire, avec pas de pointeurs vers les nœuds parents, alors la seule solution je pense est de garder un compteur de nombre d'enfants dans chaque nœud.
Cette stratégie d'équilibre entre le nombre de nœuds de chaque côté de chaque sous-arbre, ce qui est bénéfique (mais très légèrement).
C'est O(log n). Garder la trace de compter sur l'insertion nécessite à venir tout le chemin jusqu'à la toiture, mais cela ne modifie pas l'O(lon n) la nature de cette opération. Même chose avec la suppression.
Les autres opérations sont à l'habitude, et de préserver leurs caractéristiques de performance.
Avez-vous besoin de détails ou si vous préférez travailler par vous-même?
Si vous souhaitez utiliser un lié arbre binaire, sans autres informations que celles de gauche et de droite pointeurs, alors je vous suggère de lancer une prime pour au moins 100 000 points. Je ne dis pas que c'est impossible (parce que je n'ai pas les maths pour le prouver), mais je dis que cela n'a pas été trouvé dans plusieurs décennies (dont je ne sais plus).
Ma mise en œuvre des tas
De l'arbre binaire peut être représenté par un tableau:
Utilisation: