QCM Algorithmes, structures de données et complexité – Partie 25

Les algorithmes, les structures de données et la complexité sont des concepts fondamentaux en informatique, essentiels pour concevoir des systèmes performants et efficaces. Que vous soyez étudiant, professionnel en développement logiciel ou passionné par l’informatique, comprendre ces notions est crucial pour résoudre des problèmes complexes et optimiser les performances des applications. Dans cet article, nous vous proposons un QCM (Questionnaire à Choix Multiples) couvrant ces trois domaines clés. À travers ce test, vous pourrez évaluer vos connaissances en matière de conception d’algorithmes, de choix de structures de données appropriées et d’analyse de la complexité des algorithmes. Que vous soyez débutant ou confirmé, ce QCM vous aidera à tester vos compétences et à améliorer votre compréhension de ces concepts fondamentaux.
 
 

1. Quelle est la complexité temporelle de l’algorithme de recherche en profondeur (DFS) dans un graphe ?

A O(n)

B O(n + m)

C O(n²)

D O(m)

B
L’algorithme de recherche en profondeur (DFS) visite chaque nœud une fois et chaque arête une fois dans un graphe. Si n est le nombre de nœuds et m est le nombre d’arêtes, la complexité est O(n + m).

 

 

2. Quelle est la complexité en temps du code suivant ?
int example(int n) {
    if (n == 0) {
        return 1;
    }
    return n * example(n - 1);
}

A O(1)

B O(n)

C O(n²)

D O(2^n)

B
Il s’agit d’une récursion linéaire. L’algorithme appelle récursivement la fonction jusqu’à ce que n=0. Cela donne une complexité de O(n) car il y a n appels récursifs.

 

 

3. Quelle structure de données est idéale pour implémenter un tableau associatif ?

A Tableau

B Liste chaînée

C Table de hachage

D Tas

C
Les tableaux associatifs, ou dictionnaires, utilisent généralement des tables de hachage pour offrir un accès rapide aux éléments via des clés. Les tables de hachage permettent une recherche, insertion et suppression en temps constant O(1) en moyenne.

 

 
 

4. Quelle est la complexité en temps du code suivant ?
void example(int n) {
    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            for (int k = j + 1; k < n; k++) {
                printf("%d, %d, %d\n", i, j, k);
            }
        }
    }
}

A O(n)

B O(n²)

C O(n³)

D O(n⁴)

C
La première boucle s'exécute n fois, la deuxième boucle n − i fois, et la troisième boucle n − j fois. Cela donne un nombre total d'itérations de l'ordre de O(n³).

 

 

5. Dans quelle situation un algorithme de recherche par dichotomie (ou recherche binaire) ne peut-il pas être utilisé ?

A Lorsque la liste est triée

B Lorsque la liste est triée mais contient des éléments dupliqués

C Lorsque la liste n'est pas triée

D Lorsque la liste contient des nombres entiers uniquement

C
La recherche binaire fonctionne uniquement sur des listes triées. Si la liste n'est pas triée, il faut d'abord la trier pour pouvoir appliquer la recherche binaire.

 

 

6. Quelle est la complexité en temps du code suivant ?
void example(int n) {
    int i = 1;
    while (i < n) {
        printf("%d\n", i);
        i *= 3;
    }
}

A O(n)

B O(log n)

C O(n log n)

D O(3^n)

B
La valeur de i est multipliée par 3 à chaque itération. Le nombre d'itérations nécessaires pour que i dépasse n est de l'ordre de log⁡3(n), donc la complexité est O(log n).

 

 
 

7. Quel est le principal avantage des algorithmes de tri stables ?

A Ils n'ont pas besoin de mémoire supplémentaire.

B Ils conservent l'ordre des éléments égaux dans le tableau après le tri.

C Ils sont plus rapides que les autres algorithmes de tri.

D Ils sont plus faciles à implémenter.

B
Un algorithme de tri stable conserve l'ordre relatif des éléments ayant la même valeur. Par exemple, si deux éléments ont la même valeur, ils resteront dans le même ordre qu'ils avaient avant le tri.

 

 

8. Qu'est-ce que la complexité O(n log n) représente ?

A Un algorithme qui se comporte linéairement par rapport à la taille des entrées.

B Un algorithme dont la durée d'exécution augmente proportionnellement au logarithme de la taille des entrées.

C Un algorithme qui se comporte à la fois de manière linéaire et logarithmique par rapport à la taille des entrées.

D Un algorithme qui est plus rapide qu'un algorithme de complexité O(n).

C
O(n log n) signifie que l'algorithme réalise une opération linéaire (proportionnelle à n) tout en effectuant des sous-opérations logarithmiques (log n), ce qui se voit dans de nombreux algorithmes de tri comme le tri rapide ou le tri fusion.

 

 

9. Quelle est la complexité en temps du code suivant ?
void example(int n) {
    // Première boucle imbriquée
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("%d, %d\n", i, j);
        }
    }

    // Deuxième boucle
    for (int k = 0; k < n; k++) {
        printf("%d\n", k);
    }
}

A O(n)

B O(n²)

C O(n log n)

D O(n³)

B
La première partie du code (deux boucles imbriquées) a une complexité de O(n²), et la deuxième boucle a une complexité de O(n). Comme la complexité totale est dominée par la partie la plus complexe, la complexité totale est O(n²).

 

 
 

10. Quelle est la complexité en temps du code suivant ?
int example(int n) {
    if (n <= 1) {
        return n;
    }
    
    // Affiche les valeurs de i de 0 à n-1
    for (int i = 0; i < n; i++) {
        printf("%d\n", i);
    }
    
    // Appel récursif
    return example(n - 1);
}

A O(n)

B O(n²)

C O(n log n)

D O(2^n)

A
La fonction appelle récursivement example(n-1), et à chaque appel, elle effectue une boucle qui s'exécute n fois. La somme des itérations pour toutes les valeurs de n donne n+(n−1)+(n−2)+⋯+1, ce qui est une somme arithmétique égale à O(n).

 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *