2 votes

Est-ce que la méthode remove de l'itérateur de ArrayList Java est O(n^2) ou O(n) lors du parcours de la liste?

Je parcours un ArrayList en utilisant une boucle while et en enlevant les valeurs en place si elles remplissent un certain critère. Mon code est dans l'esprit de l'extrait suivant :

    List list = new ArrayList<>();
    int N = 1000
    // Configuration de la liste pour afficher un exemple
    for (int i = 0; i < N; i++) {
        list.add(i);
    }

    Date start = new Date();
    // Parcourir toute la liste, en supprimant la moitié des valeurs
    Iterator iter = list.iterator();
    while (iter.hasNext()) {
        Integer in = iter.next();
        if (in % 2 == 0) {
            // Est-ce pair ?
            iter.remove();
        }
    }

    Date end = new Date();
    System.out.println(end.getTime() - start.getTime());
    System.out.println(list.size());

Ce que je veux savoir, c'est si la complexité temporelle de cette boucle d'itération est O(N) ou O(N^2). Je crois qu'il s'agit de O(N^2) car les ArrayList Java sont basés sur un tableau régulier, et pour chaque suppression, vous devez nécessairement déplacer O(N) des valeurs suivantes vers la gauche pour maintenir le tableau dans un état cohérent.

-1voto

almel Points 2075

Aucune des réponses à ma question ne fournit de preuve de comment Iterator.remove fonctionne, donc j'ai fait mes propres tests. Mes tests personnels me conduisent à croire que la complexité temporelle est O(N^2). Voici les données de 3 tests différents, où chaque valeur "Temps" est une moyenne sur 10 itérations :

N = 10 000 Temps = 8ms

N = 100 000 Temps = 487ms

N = 200 000 Temps = 2026ms

Un doublement de la taille de la liste entraîne un temps d'exécution environ 4 fois plus long.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X