ntro.ca

        • Contrats de classe
        • Liens utiles
        • Calendrier
        • Calendrier groupe 2
        • Calendrier groupes 1, 3
        • Structure du cours
        • Évaluations
        • Matériel à se procurer
        • Les profs
          • Marc-Olivier Tremblay
          • Mathieu Bergeron
        • Module 1.1: installation + trier des cartes
        • Module 1.2: rappels POO
        • Module 1.3: tableau d'objets
        • Examen 1
        • Module 2.1: données JSON
        • Module 2.2: données en Java
        • Module 2.3: récursivité
        • Examen 2
        • Module 3.1: structure générique
        • Module 3.2: efficacité (1)
        • Module 3.3: efficacité (2)
        • Examen 3
        • Module 4.1: liste naïve
        • Module 4.2: liste par tableau
        • Module 4.3: liste chaînée
        • Examen 4
        • Module 5.1: mappage naïf
        • Module 5.2: mappage par hachage
        • Module 5.3: mappage par arbre
        • Examen 5
        • Équipes
          • Horaire groupe 1
          • Horaire groupe 2
          • Horaire groupe 3
          • Groupe 1
          • Groupe 2
          • Groupe 3
        • Projets vedettes 2022
        • Projets vedettes 2023
        • Projets vedettes 2024
        • Survol
        • Structure
        • Calendrier
        • Calendrier des séances
        • Évaluations
        • Exemples de jeu
        • Exemples de pages
        • Réponses à vos questions
        • Module 1: créer le projet
        • Module 2: concevoir l'application
        • Module 3: vues NtroFx
        • Module 4: modèle et navigation
        • Module 5: ajouter le dorsal, modifier le modèle
        • Module 7: améliorer l'affichage
        • Module 8: jeu en 2d
        • Module 9: client/serveur
        • Module 10: plusieurs instances du même modèle
        • TP1
        • Examen 1
        • TP2
        • Examen 2
        • Projet de fin de session
      • Ajout Format JSON
        • Calendrier
        • Évaluations
        • Structure du cours
        • Contrat de classe
        • Le prof
        • 01: Windows et Word
          • Astuces et raccourcis
        • 02: Word
        • 03: Word
          • Exercice Word: insertion d'éléments spéciaux
          • Exercice Word: tableaux
        • 04: Word
          • Exercice Word: références
          • TP01: Word (15%)
        • 05: PowerPoint
          • TP02: PowerPoint (10%)
        • 06: Examen Word (20%)
        • 07: Excel
        • 08: Excel
        • 09: Excel
          • TP03: Excel (15%)
        • 10: Excel
        • 11: Examen Excel (20%)
        • 12: Access
        • 13: Access
        • 14: Access
        • 15: Examen Access
      • Sondage H2023 (dept. info)
      • Vision H2023 (dept. info)
      • P1) exercices interactifs de lecture
      • P2) transition Excel vers Python
        • Atelier 2: un exemple
      • Index
      • Point de vue sur l'IA
    Theorie
    • Théorie 4.1: liste naïve
      • O(1): temps constant
      • Liste par tableau naïve

    Théorie 4.1: liste naïve #

    • Une liste est un tableau qui peut grandir et rapetisser
    Liste<Character> liste = new Liste<>(Character.class);
    
    liste;             // []
    liste.add('a')     // [a]
    liste.add('b')     // [a,b]
    liste.add('c')     // [a,b,c]
    liste.set(1,'d')   // [a,d,c]
    liste.remove('a')  // [b,c]
    
    • Comment implanter une liste de façon efficace?

    • Ça dépend. Efficace pour quelle opération?:

      • la modification d’éléments existants? (module 5.1)
      • l’ajout et le retrait de nouveaux éléments? (module 5.2)
    • Rappel, voici les méthodes d’une liste

    void    add(E e);                       // ajoute à la fin
    void    addAll(E[] valeurs_a_ajouter);  // insère toutes les valeurs
    void    insert(int position, E e);      // insère une nouvelle valeur à la position i
    void    set(int position, E e);         // modifie la valeur à la position i
    E       get(int position);              // obtenir la valeur à la position i
    void    clear();                        // vide la liste
    int     size();                         // taille de la liste
    boolean isEmpty();                      // si vide
    boolean contains(Object o);             // si la liste contient la valeur o
    int     indexOf(Object o);              // indice de la valeur o
    void    removeValue(Object o);          // indice de la valeur o
    void    remove(int position);           // indice de la valeur o
    

    O(1): temps constant #

    • Quand on a parlé d’efficacité, on a définit:

      • Efficace:
        • O(log(n)): temps logarithmique
        • O(n): temps linéaire
      • Pas efficace:
        • O(n2): temps quadratique
        • O(2n): temps exponentiel
    • Il faut ajouter:

      • Efficace:
        • O(1): temps constant
          • le nombre d’instructions ne dépend pas de la taille des données
    • Accéder à une valeur dans un tableau se fait en temps contant:

    char[] tableau = new char[TAILLE];
    
    char element(int position){
    
        return tableau[position];   // 1 instruction
                                    // même si TAILLE est grand
    
    • Même chose pour modifier une valeur dans un tableau:
    char[] tableau = new char[TAILLE];
    
    void modifier(int position, char element){
    
        tableau[position] = element;   // 1 instruction
                                       // même si TAILLE est grand
    }
    

    Liste par tableau naïve #

    • Le plus simple est de mémoriser les éléments de la liste dans un tableau
    public class ListeNaive<E extends Object> extends ListeJava<E> {
    
        private E[] elements;
    
    • La modification d’un élément existant se fera en temps constant
        @Override
        public void set(int i, E e) {
            elements[i] = e;
        }
    
    • Pour ajouter un nouvel élément, c’est plus compliqué:
        @Override
        public void add(E e) {
            E[] nouveauxElements = nouveauTableau(elements.length + 1);
    
            for(int i = 0; i < elements.length; i++){
                nouveauxElements[i] = elements[i];
            }
            
            nouveauxElements[nouveauxElements.length - 1] = e;
            
            elements = nouveauxElements;
        }
    
    • Pour ajouter un élément, il faut:

      • créer un nouveau tableau plus grand d’un emplacement
      • copier les éléments existants dans le nouveau tableau
      • mémoriser le nouvel élement dans le nouvel emplacement
    • L’opération se fait en temps linéaire O(n)

    • Le problème est que add est typiquement utilisé dans une boucle

    • P.ex. pour mélanger une liste:

    Liste<Character> melanger(Liste<Character> entree){
    
        Liste<Character> resultat;
        resultat = nouvelleListe();
    
        while(!entree.isEmpty()){
    
            int positionAuHasard = alea.nextInt(entree.size());
    
            Character elementAuHasard = entree.get(positionAuHasard);
    
            resultat.add(elementAuHasard);   // cache une boucle?
    
            entree.remove(positionAuHasard); // cache une boucle?
        }
    
        return resultat;
    }
    
    • On a une boucle qui visite les éléments de entree

      • si chaque add requiert une autre boucle sur les éléments
      • on va avoir une boucle dans une boucle et donc O(n2)
    Creative Commons License Creative Commons Attribution Creative Commons ShareAlike
    • Théorie 4.1: liste naïve
      • O(1): temps constant
      • Liste par tableau naïve