web-dev-qa-db-fra.com

Pourquoi la suppression d'un élément à la fin du tableau dynamique O(n) la complexité du temps?

Je suis en train de lire mon manuel et je ne comprends absolument pas pourquoi un tableau dynamique aurait besoin de O(n) temps pour supprimer un élément à la fin. Je comprends que supprimer un élément de n’importe quel autre index est O(n) car vous devez copier toutes les données et les déplacer pour combler le vide, mais si c’est à la fin, nous ne faisons pas que décrémenter les compter et définir l'index comme 0 ou null? J'ai inclus une photo de mon livre. C’est bizarre parce qu’il dit que l’indexation est O(1), nous devons donc savoir où se trouve l’élément afin de ne pas avoir à parcourir le tableau comme une liste chaînée.enter image description here

10
Belphegor

Tout d’abord, regardons ce que les livres signifient avec un "Dynamic Array":

Le tableau dynamique (également appelé tableau cultivable, tableau redimensionnable, Table dynamique ou liste de tableaux) est une structure de données à accès aléatoire de liste de taille variable qui permet d'ajouter ou de supprimer des éléments . [...]
Remarque: Nous verrons l'implémentation de dynamic array dans les chapitres Stacks, Queues et Hashing.

Nous apprenons de cela que les listes de tableaux sont des exemples d'un "Tableau dynamique" tel que défini par l'auteur du livre.

Mais en regardant plus loin, le livre mentionnait que:

Dès que ce tableau est plein, créez le nouveau tableau de taille double que le tableau d'origine. De même, réduit la taille du tableau à la moitié si les éléments du tableau sont inférieurs à la moitié .

(italique ajouté par moi)

Java ArrayList ne le fait pas - il ne diminue pas en stockage lorsque des éléments sont supprimés. Mais l'auteur parle de (ou croit que ArrayList réduit) la taille du tableau . Dans ce cas, du point de vue du pire des cas, vous pourriez dire que la complexité est O(n) car la réduction de la taille implique la copie des éléments n. au tableau réduit.

Conclusion:

Bien que ce ne soit pas le cas pour les implémentations Java ArrayList, lorsque l'auteur de ce livre parle de "tableaux dynamiques" qui "réduisent la taille du tableau" lors de la suppression, le cas échéant, then la complexité la plus défavorable d'une suppression à la fin de le tableau est en effet O(n).

14
Erwin Bolwidt

Cette entrée semble être soit

  1. incorrect, ou
  2. vrai, mais trompeur.

Vous avez absolument raison de dire que vous pouvez simplement détruire l'objet à la position finale dans un tableau dynamique, puis décrémenter la taille pour supprimer le dernier élément. Dans de nombreuses implémentations de tableaux dynamiques, vous devrez parfois effectuer des opérations de redimensionnement pour vous assurer que la taille du tableau alloué se situe dans les limites du facteur constant du nombre d'éléments. Si cela se produit, alors oui, vous devrez créer un nouveau tableau, copier les anciens éléments et libérer le tableau précédent, ce qui prend du temps O (n). Cependant, vous pouvez montrer que ces redimensionnements sont suffisamment rares pour que le coût moyen de la suppression de la fin soit égal à O (1). (Dans un sens plus technique, nous disons que le coût amorti de la suppression d'un élément de la fin est O (1)). Autrement dit, tant que vous ne vous préoccupez que du coût total d’une série d’opérations plutôt que du coût d’une opération à l’autre, vous n’auriez pas tort de prétendre que chaque opération vous coûte du temps O (1).

Je dirais que vous êtes probablement en train de regarder une faute de frappe dans les matériaux. En regardant leur entrée pour ajouter à la fin, ce qui différencie les cas non-complets des cas complets, je pense que ceci est probablement une erreur de copier/coller. Suivant l’avance de la table, cela devrait indiquer quelque chose comme "O (1) si le tableau n’est pas 'trop vide,' O(n) sinon." Mais encore une fois, gardez à l’esprit que l’efficacité amortie de chaque opération est O (1), ce qui signifie que ces termes effrayants O(n) ne risquent pas vraiment de vous brûler, sauf si vous êtes en un environnement spécialisé où chaque opération doit fonctionner très rapidement.

5
templatetypedef

En Java pour Dynamic array (ArrayList), la complexité temporelle de la suppression du dernier élément est o(1) en Java, il ne copie pas arrayin Java vérifie la fin de l'index du tableau.

  int numMoved = size - index - 1;
        if (numMoved > 0)
         //copy array element 
1
Teja Venkat Lanka

L'insertion et la suppression sont des opérations que nous n'effectuons généralement pas sur des tableaux, car elles ont une longueur fixe par nature. Vous ne pouvez pas augmenter ou diminuer la longueur de quelque chose qui est fixé par sa nature.

Lorsque les gens parlent de "tableaux dynamiques" en Java, ils ont tendance à vouloir dire que class ArrayList est soutenu par un tableau, ce qui donne l’illusion de pouvoir insérer et supprimer des éléments.

Mais pour qu’un logiciel donne l’illusion d’effectuer des insertions et des suppressions sur un tableau, chaque fois (ou presque, des optimisations sont possibles), il doit allouer un nouveau tableau de la nouvelle longueur souhaitée et copier le l’ancien tableau, en sautant l’élément supprimé ou en ajoutant l’élément inséré, selon le cas. Cette copie de tableau est d’où vient le O(N).

Et, en raison des optimisations effectuées par ArrayList, le tableau que vous avez posté n'est pas précis: il devrait plutôt indiquer 'O (1) si le tableau n'a pas beaucoup diminué, O(N) si le tableau a été réduit à tel point que la réaffectation est jugée nécessaire ». Mais je suppose que cela aurait été trop long pour tenir dans la cellule de table.

1
Mike Nakis

Pour autant que je pense. Comme il s’agit d’un tableau dynamique, le système informatique ne sait pas quelle est la longueur actuelle de ce tableau dynamique. Il faut donc trouver la longueur de ce tableau dynamique O(n) et prend ensuite O(1) pour supprimer l'élément à la fin.

0
Mohd Akbar

La suppression d'un élément du tableau dynamique (ArrayList en Java) nécessite Search pour l'élément et que Delete

Si l'élément est à la fin de la liste, la recherche elle-même entraînera un temps de calcul de n. J'espère que cela a du sens pour vous.

Vous pouvez afficher le code source à l’adresse http://www.docjar.com/html/api/Java/util/ArrayList.Java.html

0
Noman Khan