Quelles sont les principales différences entre une liste chaînée et un BinarySearchTree? Est-BST juste une façon de maintenir un LinkedList? Mon instructeur a parlé de LinkedList puis BST mais did't les comparer ou n'a pas dit quand préférer un sur l'autre. Ceci est probablement une question stupide mais je suis vraiment confus. Je vous serais reconnaissant si quelqu'un peut clarifier cela d'une manière simple.
La différence entre une LinkedList et un arbre de recherche binaire
Je dirais que la principale différence est qu'un arbre de recherche binaire est triée. Lorsque vous insérez dans un arbre de recherche binaire, où ces éléments finissent par être stockés dans la mémoire est une fonction de leur valeur. Avec une liste liée, les éléments sont aveuglément ajoutés à la liste quelle que soit leur valeur.
Tout de suite, vous pouvez quelques compromis: listes chaînées maintien de l'ordre d'insertion et l'insertion est moins coûteux arbres binaires de recherche sont généralement plus rapides à la recherche
Dans l'informatique, un arbre de recherche binaire (BST) est une structure de données d'arbre binaire qui a les propriétés suivantes:
- chaque noeud (élément dans l'arborescence) a une valeur distincte;
- Les deux sous-arbres gauche et droite doivent également être des arbres binaires de recherche;
- le sous-arbre gauche du noeud contient des valeurs seulement moins de la valeur du noeud;
- le sous-arbre droit du noeud contient des valeurs seulement supérieure ou égale à la valeur du noeud.
Dans l'informatique, une liste chaînée est l' une des structures de données fondamentales, et peut être utilisé pour mettre en œuvre d' autres structures de données.
Ainsi, un arbre de recherche binaire est un concept abstrait qui peut être mis en œuvre avec une liste chaînée ou un tableau. Alors que la liste chaînée est une structure de données fondamentale.
Les listes chaînées et BSTS n'ont pas vraiment beaucoup en commun, sauf qu'ils sont tous les deux structures de données qui agissent comme des conteneurs. Les listes chaînées vous permettent essentiellement d'insérer et de supprimer des éléments efficacement à tout emplacement dans la liste, tout en maintenant l'ordre de la liste. Cette liste est mise en œuvre à l' aide des pointeurs d'un élément à l'autre (et souvent le précédent).
Un arbre binaire de recherche d'autre part est une structure de données d'une abstraction plus élevé (il n'est pas spécifié comment cela est mis en œuvre en interne) qui permet des recherches efficaces ( par exemple afin de trouver un élément spécifique que vous ne devez pas regarder du tout les éléments.
Notez qu'une liste chaînée peut être considéré comme un arbre binaire dégénérée, à savoir un arbre où tous les noeuds ont seulement un enfant.
Liste liés:
Item(1) -> Item(2) -> Item(3) -> Item(4) -> Item(5) -> Item(6) -> Item(7)
arbre binaire:
Node(1)
/
Node(2)
/ \
/ Node(3)
RootNode(4)
\ Node(5)
\ /
Node(6)
\
Node(7)
Dans une liste liée, les éléments sont reliés entre eux par un seul pointeur suivant. Dans un arbre binaire, chaque nœud peut avoir 0, 1 ou 2 sous-noeuds, où (en cas d'un arbre de recherche binaire) la clé du noeud gauche est inférieure à la clé du nœud et la clé du nœud droit est plus le noeud. Tant que l'arbre est équilibré, le searchpath à chaque élément est beaucoup plus court que dans une liste chaînée.
Searchpaths:
------ ------ ------
key List Tree
------ ------ ------
1 1 3
2 2 2
3 3 3
4 4 1
5 5 3
6 6 2
7 7 3
------ ------ ------
avg 4 2.43
------ ------ ------
Par des structures plus le chemin de recherche moyenne devient significative plus petite:
------ ------ ------
items List Tree
------ ------ ------
1 1 1
3 2 1.67
7 4 2.43
15 8 3.29
31 16 4.16
63 32 5.09
------ ------ ------
Un arbre de recherche binaire peut être mis en œuvre de toute façon, il n'a pas besoin d'utiliser une liste chaînée.
Une liste liée est simplement une structure qui contient des noeuds et des pointeurs / références à d'autres noeuds à l'intérieur d'un noeud. Compte tenu du nœud de tête d'une liste, vous pouvez parcourir à tout autre noeud dans une liste chaînée. listes Doublement liés ont deux pointeurs / références: la référence normale au noeud suivant, mais aussi une référence au nœud précédent. Si le dernier nœud dans une liste doublement chaînée fait référence au premier noeud dans la liste comme le nœud suivant, et le premier noeud fait référence au dernier noeud comme noeud précédent, il est dit une liste circulaire.
Un arbre de recherche binaire est un arbre qui divise son entrée en deux parties à peu près égales, à partir d'un algorithme de comparaison de recherche binaire. Ainsi, il n'a besoin que de très peu de recherches pour trouver un élément. Par exemple, si vous aviez un arbre avec 1-10 et vous avez besoin de rechercher trois, d'abord l'élément en haut serait vérifiée, probablement 5 ou 6. Trois serait inférieur à celui, alors que la première moitié du arbre serait alors vérifié. Si la valeur suivante est 3, vous l'avez, sinon, une comparaison est faite, etc., jusqu'à ce qu'il ne soit pas trouvé ou ses données sont renvoyées. Ainsi, l'arbre est rapide pour la recherche, mais pas nessecarily rapide pour l'insertion ou la suppression. Ce sont des descriptions très approximatives.
Lié Liste de wikipedia, et binaire arbre de recherche , également de wikipedia.
Une liste chaînée est juste que ... une liste. Il est linéaire; chaque noeud a une référence au noeud suivant (et le précédent, si vous parlez d'une liste doublement liée). A branches d'arbre --- chaque noeud a une référence à divers nœuds enfants. Un arbre binaire est un cas particulier dans lequel chaque noeud a deux enfants. Ainsi, dans une liste chaînée, chaque noeud a un noeud précédent et un noeud suivant, et dans un arbre binaire, un nœud a un enfant gauche, droit de l'enfant et des parents.
Ces relations peuvent être bi-directionnel ou uni-directionnel, selon la façon dont vous devez être en mesure de traverser la structure.
Il est en fait assez simple. Une liste chaînée est juste un tas d'articles enchaînées ensemble, sans ordre particulier. Vous pouvez penser comme un arbre vraiment maigre que jamais branches:
1 -> 2 -> 5 -> 3 -> 9 -> 12 -> |i. (Ce dernier est une tentative ascii-art à une valeur nulle de terminaison)
Un binaire arbre de recherche est différent de 2 façons: la partie binaire signifie que chaque nœud a 2 enfants, non pas un, et la partie de recherche signifie que ces enfants sont conçus pour accélérer les recherches - que les petits objets à la gauche, et ceux que les grandes à droite:
5
/ \
3 9
/ \ \
1 2 12
9 n'a pas d'enfant à gauche, et 1, 2 et 12 sont « feuilles » - ils ont pas de branches.
Sens?
Pour la plupart des types d'utilisations « de consultation », un BST est mieux. Mais juste pour « tenir une liste des choses à traiter plus tard First In First Out ou Last In First Out » sortes de choses, une liste chaînée pourrait bien fonctionner.
Liste chaînée sont des données linéaires droites avec des noeuds adjacents reliés les uns aux autres par exemple A-> B-> C. Vous pouvez le considérer comme une clôture droite.
BST est une structure hiérarchique comme un arbre avec le tronc principal relié aux branches et les branches en virage reliées à d'autres branches et ainsi de suite. Le mot « binaire » signifie ici chaque branche est reliée à un maximum de deux branches.
Vous utilisez liste chaînée pour représenter directement des données uniquement avec chaque élément connecté à un maximum d'un élément; alors que vous pouvez utiliser BST pour connecter un élément à deux éléments. Vous pouvez utiliser BST pour représenter un ensemble de données telles que l'arbre de la famille, mais que deviendra l'arbre de recherche n-aire car il peut y avoir plus de deux enfants à chaque personne.
Ils sont totalement différentes structures de données.
Une liste liée est une séquence d'éléments où chaque élément est lié à la suivante, et dans le cas d'une liste doublement lié, la précédente.
Un arbre de recherche binaire est quelque chose de totalement différent. Il a un nœud racine, le nœud racine a jusqu'à deux nœuds enfants, et chaque nœud enfant peut avoir jusqu'à deux notes d'enfants , etc. , etc. Il est une structure de données assez intelligent, mais ce serait un peu fastidieux d'expliquer ici. Consultez l' artcle Wikipedia sur elle.
Le problème avec une liste chaînée est à la recherche en elle (que ce soit pour la recherche ou insérer).
Pour une liste unique liée, vous devez commencer à la tête et la recherche séquentielle pour trouver l'élément désiré. Pour éviter la nécessité d'analyser la liste, vous avez besoin des références supplémentaires aux noeuds de la liste, dans ce cas, il est plus une simple liste liée.
Un arbre binaire permet la recherche et l'insertion plus rapide en étant par nature et navigable triés.
Une alternative que je l'ai utilisé avec succès dans le passé est un SkipList. Cela donne quelque chose de semblable à une liste liée, mais avec des références supplémentaires pour permettre des performances de recherche comparable à un arbre binaire.
Une liste liée est un numéro séquentiel de « nœuds » liés les uns aux autres, à savoir:
public class LinkedListNode
{
Object Data;
LinkedListNode NextNode;
}
Un binaire arbre de recherche utilise une structure de nœud similaire, mais au lieu de lier au noeud suivant, il relie deux nœuds enfants:
public class BSTNode
{
Object Data
BSTNode LeftNode;
BSTNode RightNode;
}
En suivant des règles spécifiques lors de l'ajout de nouveaux nœuds à un BST, vous pouvez créer une structure de données qui est très rapide à parcourir. D'autres réponses ici ont détaillé ces règles, je voulais juste montrer au niveau du code de la différence entre les classes de nœuds.
Il est important de noter que si vous insérez des données triées dans un BST, vous vous retrouverez avec une liste liée, et vous perdez l'avantage d'utiliser un arbre.
À cause de cela, une liste chaînée est un O (N) structure de données traversal, tandis qu'un BST est un O (N) structure de données dans le traversal pire des cas, et un O (log N) dans le meilleur des cas.
Un binaire de recherche d' arbre est un arbre binaire dans lequel chaque noeud interne x stocke un élément tel que l'élément stocké dans le sous - arbre gauche de x sont inférieures ou égales à x et les éléments stockés dans le sous - arbre droit de x est supérieur ou égal à x .
![]()
Maintenant , une liste chaînée se compose d'une suite de noeuds, chacun contenant des valeurs arbitraires et un ou deux références pointant vers l'autre et / ou les noeuds précédents.
![]()
Ils ont des similitudes, mais la principale différence est que Binary Search Tree est conçu pour soutenir la recherche efficace pour un élément, ou « clé ».
Un arbre de recherche binaire, comme une liste doublement chaînée, souligne deux autres éléments de la structure. Cependant, lors de l'ajout d'éléments à la structure, plutôt que de les annexant à la fin de la liste, l'arbre binaire est réorganisée de telle sorte que des éléments liés au nœud « gauche » est inférieur au noeud courant et les éléments liés à la « bonne » le noeud est plus grand que le noeud courant.
Dans une mise en oeuvre simple, le nouvel élément est comparé au premier élément de la structure (la racine de l'arbre). Si elle est moins, la branche « gauche » est prise, sinon la branche « droit » est examiné. Cela continue avec chaque nœud, jusqu'à ce qu'une branche se trouve être vide; le nouvel élément remplit cette position.
Avec cette approche simple, si des éléments sont ajoutés dans l'ordre, vous vous retrouvez avec une liste liée (avec les mêmes performances). Différents algorithmes existent pour maintenir un certain équilibre dans l'arbre, par des nœuds réarranger. Par exemple, les arbres AVL font le plus de travail pour maintenir l'arbre aussi équilibré que possible, donner les meilleurs temps de recherche. arbres rouges-noirs ne tiennent pas l'arbre comme équilibré, entraînant des recherches un peu plus lent, mais font moins de travail en moyenne que les clés sont insérés ou supprimés.













