J'ai toujours pensé que les tas et les files d'attente prioritaires étaient synonymes - une structure de données abstraite qui prend en charge les opérations insert
, findMin
et deleteMin
.
Certains ouvrages semblent être d'accord avec moi - les structures de données purement fonctionnelles de Chris Okasaki (chapitre 3), par exemple.
D'un autre côté, la page tas de Wikipedia la définit comme une structure de données basée sur un arbre, et déclare que les tas sont une implémentation concrète des files d'attente prioritaires.
J'ai du mal à concilier cela avec le fait que je peux penser à plus d'une implémentation de tas - tas de gauche, tas binomiaux, tas évasés ...
Le simple fait qu'un tas puisse être implémenté avec différentes structures de données ne signifie-t-il pas, par définition, qu'il s'agit d'une structure de données abstraite? Et si c'est le cas, y a-t-il une différence réelle avec les files d'attente prioritaires?
Une file d'attente prioritaire peut avoir n'importe quelle implémentation, comme un tableau que vous recherchez de façon linéaire lorsque vous sautez. Tout cela signifie que lorsque vous sautez, vous obtenez la valeur avec le minimum ou le maximum en fonction.
Un tas classique tel qu'il est généralement appelé est généralement un tas min. Une implémentation qui a une bonne complexité temporelle (O(log n)
sur Push and pop) et aucune surcharge de mémoire.
Ce site Web fournit une explication très claire. http://pages.cs.wisc.edu/~vernon/cs367/notes/11.PRIORITY-Q.html
En bref, une file d'attente prioritaire peut être implémentée à l'aide de nombreuses structures de données que nous avons déjà étudiées (un tableau, une liste chaînée ou un arbre de recherche binaire). Cependant, ces structures de données ne fournissent pas les opérations les plus efficaces. Pour rendre toutes les opérations très efficaces, nous utiliserons une nouvelle structure de données appelée tas.
Je pense que ce que vous avez écrit sur concret vs abstrait est correct. Lorsque vous dites que les tas étalés, les tas binomiaux sont des implémentations différentes des tas, je pense qu'il est plus correct de dire qu'il s'agit de différents types de tas. Heap, je pense à une catégorie d'implémentation qui garantit généralement non seulement la même interface, mais aussi les mêmes temps d'accès.
Vous voyez cela avec des cartes associatives, des tables de hachage et des arbres de recherche binaires. Bsts et tables de hachage sont deux structures de données concrètes qui fournissent l'interface abstraite de la carte associative. Les arbres noirs rouges et les arbres avl sont tous deux des bst équilibrés, avec les mêmes garanties O et la même interface supplémentaire (dans l'ordre de traversée). Ce sont différents types d'arbres, je dirais plus que différentes implémentations d'arbres. Ce sont des implémentations différentes mais étroitement liées de cartes associatives.