web-dev-qa-db-fra.com

Différence entre une liste liée et un arbre de recherche binaire

Quelles sont les principales différences entre une liste liée et un BinarySearchTree? La BST est-elle juste un moyen de maintenir une LinkedList? Mon instructeur a parlé de LinkedList puis de BST mais ne les a pas comparés ou n'a pas dit quand préférer l'un à l'autre. C'est probablement une question stupide mais je suis vraiment confus. J'apprécierais que quelqu'un puisse clarifier cela d'une manière simple.

38
ashokgelal

Liste liée:

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 liés entre eux via un seul pointeur suivant. Dans un arbre binaire, chaque nœud peut avoir 0, 1 ou 2 sous-nœuds, où (dans le cas d'un arbre de recherche binaire) la clé du nœud gauche est inférieure à la clé du nœud et la clé du nœud droit est supérieure à le nœud. Tant que l'arborescence est équilibrée, le chemin de recherche de chaque élément est beaucoup plus court que celui d'une liste chaînée.

Chemins de recherche:

------ ------ ------
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 grandes, le chemin de recherche moyen devient beaucoup plus petit:

------ ------ ------
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
------ ------ ------
79
Toon Krijthe

A Binary Search Tree est un arbre binaire dans lequel chaque nœud interne x stocke un élément tel que l'élément stocké dans la gauche sous-arbre de x sont inférieurs ou égaux à x et les éléments stockés dans le sous-arbre droit de x est supérieur ou égal à x .

alt text

Maintenant, une Linked List se compose d'une séquence de nœuds, chacun contenant des valeurs arbitraires et une ou deux références pointant vers les nœuds suivants et/ou précédents.

Linked List

16
CMS

En informatique, un arbre de recherche binaire (BST) est une structure de données d'arbre binaire qui a les propriétés suivantes:

  • chaque nœud (élément dans l'arborescence) a une valeur distincte;
  • les sous-arbres gauche et droit doivent également être des arbres de recherche binaires;
  • le sous-arbre gauche d'un nœud ne contient que des valeurs inférieures à la valeur du nœud;
  • la sous-arborescence droite d'un nœud ne contient que des valeurs supérieures ou égales à la valeur du nœud.

En informatique, une liste chaînée est l'une des structures de données fondamentales et peut être utilisée pour implémenter d'autres structures de données.

Un arbre de recherche binaire est donc un concept abstrait qui peut être implémenté avec une liste chaînée ou un tableau. Alors que la liste chaînée est une structure de données fondamentale.

13

Je dirais que la différence principale est qu'un arbre de recherche binaire est trié. Lorsque vous insérez dans une arborescence de recherche binaire, où ces éléments finissent par être stockés en mémoire est fonction de leur valeur. Avec une liste liée, les éléments sont aveuglément ajoutés à la liste quelle que soit leur valeur.

Vous pouvez tout de suite faire des compromis: les listes liées préservent l'ordre d'insertion et l'insertion est moins coûteuse. Les arbres de recherche binaire sont généralement plus rapides à rechercher.

8
Zugwalt

Une liste chaînée est un nombre séquentiel de "nœuds" liés les uns aux autres, c'est-à-dire:

public class LinkedListNode
{
     Object Data;
     LinkedListNode NextNode;
}

Un arbre de recherche binaire utilise une structure de nœuds similaire, mais au lieu de se lier au nœud suivant, il est lié à 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 très rapide à parcourir. D'autres réponses ici ont détaillé ces règles, je voulais juste montrer au niveau du code 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 perdrez l'avantage d'utiliser une arborescence.

De ce fait, une LinkedList est une structure de données de traversée O(N), alors qu'une BST est une structure de données de traversée O(N) dans le pire des cas) et un O (log N) dans le meilleur des cas.

7
FlySwat

Les listes liées et les BST n'ont pas vraiment beaucoup en commun, sauf qu'ils sont tous deux des structures de données qui agissent comme des conteneurs. Listes liées vous permet essentiellement d'insérer et de supprimer efficacement des éléments à n'importe quel endroit de la liste, tout en maintenant l'ordre de la liste . Cette liste est implémentée à l'aide de pointeurs d'un élément au suivant (et souvent le précédent).

Un arbre de recherche binaire d'autre part est une structure de données d'une abstraction supérieure (c'est-à-dire qu'elle n'est pas spécifiée comment ceci est implémenté en interne) qui permet des recherches efficaces (c'est-à-dire que pour trouver un élément spécifique, vous n'avez pas à regarder tous les éléments.

Notez qu'une liste chaînée peut être considérée comme un arbre binaire dégénéré, c'est-à-dire un arbre où tous les nœuds n'ont qu'un seul enfant.

5
Konrad Rudolph

C'est en fait assez simple. Une liste chaînée n'est qu'un groupe d'éléments enchaînés, sans ordre particulier. Vous pouvez le considérer comme un arbre vraiment maigre qui ne se ramifie jamais:

1 -> 2 -> 5 -> 3 -> 9 -> 12 -> |i. (ce dernier est une tentative ascii-art de terminer un null)

Un arbre de recherche binaire est différent de 2 façons: la partie binaire signifie que chaque nœud a 2 enfants, pas un, et la partie recherche signifie que ces enfants sont organisés pour accélérer les recherches - seulement des éléments plus petits à à gauche, et seulement les plus grands à droite:

    5
   / \
  3   9
 / \   \
1   2   12

9 n'a pas d'enfant à gauche, et 1, 2 et 12 sont des "feuilles" - ils n'ont pas de branches.

Ça a du sens?

Pour la plupart des utilisations "de recherche", un BST est préférable. Mais pour simplement "garder une liste de choses à traiter avec des choses ultérieures de type premier entré premier sorti ou dernier entré premier sorti", une liste chaînée pourrait bien fonctionner.

4
Mike G.

Ils ont des similitudes, mais la principale différence est qu'un arbre de recherche binaire est conçu pour prendre en charge une recherche efficace d'un élément, ou "clé".

Un arbre de recherche binaire, comme une liste à double liaison, pointe vers deux autres éléments de la structure. Cependant, lors de l'ajout d'éléments à la structure, plutôt que de simplement les ajouter à la fin de la liste, l'arborescence binaire est réorganisée de sorte que les éléments liés au nœud "gauche" soient inférieurs au nœud actuel et les éléments liés à la "droite" le nœud est supérieur au nœud actuel.

Dans une implémentation simple, le nouvel élément est comparé au premier élément de la structure (la racine de l'arbre). Si c'est moins, la branche "gauche" est prise, sinon la branche "droite" est examinée. Cela continue avec chaque nœud, jusqu'à ce qu'une branche se révèle vide; le nouvel élément occupe cette position.

Avec cette approche simple, si des éléments sont ajoutés dans l'ordre, vous vous retrouvez avec une liste chaînée (avec les mêmes performances). Différents algorithmes existent pour maintenir une certaine mesure d'équilibre dans l'arbre, en réorganisant les nœuds. Par exemple, les arbres AVL font le plus de travail pour garder l'arbre aussi équilibré que possible, donnant les meilleurs temps de recherche. Les arbres rouge-noir ne gardent pas l'arbre aussi équilibré, ce qui entraîne des recherches légèrement plus lentes, mais font moins de travail en moyenne lorsque les clés sont insérées ou supprimées.

4
erickson

Une liste chaînée est juste que ... une liste. C'est linéaire; chaque nœud a une référence au nœud suivant (et au précédent, si vous parlez d'une liste doublement liée). Un arbre branches --- chaque nœud a une référence à divers nœuds enfants. Un arbre binaire est un cas spécial dans lequel chaque nœud n'a que deux enfants. Ainsi, dans une liste chaînée, chaque nœud a un nœud précédent et un nœud suivant, et dans un arbre binaire, un nœud a un enfant gauche, un enfant droit et un parent.

Ces relations peuvent être bidirectionnelles ou unidirectionnelles, selon la façon dont vous devez pouvoir traverser la structure.

3
Adam Jaskiewicz

Le problème avec une liste chaînée est la recherche à l'intérieur (que ce soit pour la récupération ou l'insertion).

Pour une liste à lien unique, vous devez commencer par la tête et rechercher séquentiellement pour trouver l'élément souhaité. Pour éviter d'avoir à analyser toute la liste, vous avez besoin de références supplémentaires aux nœuds de la liste, auquel cas il ne s'agit plus d'une simple liste chaînée.

Un arbre binaire permet une recherche et une insertion plus rapides en étant intrinsèquement triées et navigables.

Une alternative que j'ai utilisée avec succès dans le passé est une SkipList. Cela fournit quelque chose de semblable à une liste chaînée mais avec des références supplémentaires pour permettre des performances de recherche comparables à un arbre binaire.

3
Steve Morgan

La liste liée est des données linéaires droites avec des nœuds adjacents connectés les uns aux autres, par exemple A-> B-> C. Vous pouvez le considérer comme une clôture droite.

Le BST est une structure hiérarchique tout comme un arbre avec le tronc principal connecté à des branches et ces branches à leur tour connectées à d'autres branches et ainsi de suite. Le mot "binaire" signifie ici que chaque branche est connectée à un maximum de deux branches.

Vous utilisez la liste chaînée pour représenter des données directes uniquement avec chaque élément connecté à un maximum d'un élément; tandis que vous pouvez utiliser BST pour connecter un élément à deux éléments. Vous pouvez utiliser BST pour représenter des données telles que l'arbre généalogique, mais cela deviendra un arbre de recherche n-aire car il peut y avoir plus de deux enfants par personne.

2
Salman Kasbati

Un arbre de recherche binaire peut être implémenté de n'importe quelle façon, il n'a pas besoin d'utiliser une liste chaînée.

Une liste chaînée est simplement une structure qui contient des nœuds et des pointeurs/références à d'autres nœuds à l'intérieur d'un nœud. Étant donné le nœud principal d'une liste, vous pouvez rechercher n'importe quel autre nœud dans une liste liée. Les listes à double liaison ont deux pointeurs/références: la référence normale au nœud suivant, mais aussi une référence au nœud précédent. Si le dernier nœud d'une liste à double liaison fait référence au premier nœud de la liste en tant que nœud suivant et que le premier nœud fait référence au dernier nœud en tant que nœud précédent, il s'agit d'une liste circulaire.

Un arbre de recherche binaire est un arbre qui divise son entrée en deux moitiés à peu près égales sur la base d'un algorithme de comparaison de recherche binaire. Ainsi, il suffit de très peu de recherches pour trouver un élément. Par exemple, si vous aviez un arbre avec 1-10 et que vous deviez en rechercher trois, d'abord l'élément en haut serait vérifié, probablement un 5 ou 6. Trois serait moins que cela, donc seule la première moitié de la l'arbre serait alors vérifié. Si la valeur suivante est 3, vous l'avez, sinon une comparaison est effectuée, etc., jusqu'à ce qu'elle ne soit pas trouvée ou que ses données soient renvoyées. Ainsi, l'arbre est rapide pour la recherche, mais pas nécessairement rapide pour l'insertion ou la suppression. Ce sont des descriptions très approximatives.

Liste liée de wikipedia, et Arbre de recherche binaire , également de wikipedia.

1
MetroidFan2002

Ce sont des structures de données totalement différentes.

Une liste chaînée est une séquence d'éléments où chaque élément est lié au suivant, et dans le cas d'une liste doublement liée, le précédent.

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 enfants, etc. C'est une structure de données assez intelligente, mais il serait quelque peu fastidieux de l'expliquer ici. Découvrez le Wikipedia artcle là-dessus.

1
Tamas Czinege