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

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. Lequel des cas suivants n’existe pas dans la théorie de la complexité?

A Meilleur cas

B Pire cas

C Moyenne cas

D Cas null

D
Dans la théorie de la complexité, les trois cas couramment analysés sont:

  • Meilleur cas : La complexité dans le scénario où l’algorithme fonctionne de manière optimale.
  • Pire cas : La complexité dans le scénario où l’algorithme prend le plus de temps possible pour traiter une entrée.
  • Cas moyen : La complexité dans le scénario moyen, basé sur une distribution statistique des entrées possibles.

Le « cas null » n’est pas un terme standard utilisé dans la théorie de la complexité.

 

2. Quelle est la pire complexité temporelle du tri par insertion où la position des données à insérer est calculée à l’aide d’une recherche binaire?

A N

B N * logN

C N ^ 2

D N (logN) ^ 2

C
Même si la position d’insertion est calculée à l’aide d’une recherche binaire, le tri par insertion reste un algorithme de type O(n²) dans le pire des cas en termes de complexité temporelle.

Explication :

  • Lors de la recherche binaire, on trouve la position d’insertion en O(log n), ce qui est plus rapide que la recherche linéaire, mais une fois la position trouvée, il faut toujours déplacer les éléments à droite de cette position pour insérer l’élément au bon endroit. Cela prend O(n) dans le pire des cas.
  • Donc, même avec la recherche binaire, le tri par insertion nécessite toujours O(n²) pour déplacer les éléments dans le pire des cas, ce qui reste sa complexité temporelle en O(n²).

 

3. Quel est l’algorithme de tri le plus simple à implémenter ?

A Tri rapide (Quicksort)

B Tri par insertion

C Tri à bulles

D Tri fusion (Merge Sort)

A
Le tri à bulles est l’algorithme de tri le plus simple à implémenter, mais il est également l’un des moins efficaces, avec une complexité en O(n²) dans le pire des cas. Il consiste à comparer des paires d’éléments adjacents et à les échanger si nécessaire.

 

 

4. Le pire cas se produit dans l’algorithme de recherche linéaire lorsque ________?

A L’élément se trouve au milieu du tableau

B L’élément ne se trouve pas dans le tableau

C L’élément se trouve dans la dernière position du tableau

D L’élément se trouve dans la dernière position du tableau ou il n’existe pas

D
Le pire cas dans l’algorithme de recherche linéaire se produit lorsque l’élément recherché est soit dans la dernière position du tableau (ce qui signifie que l’algorithme doit parcourir tous les éléments jusqu’à la fin), soit lorsqu’il n’est pas présent du tout, et l’algorithme doit parcourir l’ensemble du tableau sans trouver l’élément. Dans ces deux cas, l’algorithme parcourt tous les éléments du tableau, ce qui donne une complexité de O(n) dans le pire cas.

 

5. Considérons les boucles for suivantes:

A for(i = 0; i < n; i++)

B for(i = 0; i < n; i += 2)

C for(i = 1; i < n; i *= 2)

D for(i = n; i < -1; i /= 2)

Si n est la taille de l’entrée (positive), quelle boucle est la plus efficace ?

C
La boucle la plus efficace en termes de complexité temporelle est celle qui prend le moins de temps pour s’exécuter par rapport à la taille de l’entrée n. Voici l’analyse de chaque boucle :

A: for(i = 0; i < n; i++) Cette boucle s'exécute n fois, donc la complexité est O(n).

B: for(i = 0; i < n; i += 2) Cette boucle incrémente i de 2 à chaque itération. Cela signifie qu'elle s'exécutera environ n / 2 fois, donc la complexité est toujours O(n). Cependant, elle effectuera la moitié du nombre d'itérations de la boucle précédente, mais en termes de complexité, cela reste O(n).

C: for(i = 1; i < n; i *= 2) Cette boucle double i à chaque itération. Elle s'exécute jusqu'à ce que i atteigne n, donc le nombre d'itérations est de l'ordre de log₂(n). La complexité est donc O(log n), ce qui est beaucoup plus efficace que O(n) pour de grandes valeurs de n.

D: for(i = n; i < -1; i /= 2) Cette boucle divise i par 2 à chaque itération. Elle commence avec i = n et continue tant que i est supérieur ou égal à -1. Cela signifie qu'elle s'exécute aussi en O(log n), car i est divisé par 2 à chaque itération, mais la boucle ne sera probablement pas exécutée du tout si n est positif, car la condition i < -1 ne sera jamais vraie. En pratique, cette boucle ne s'exécute pas.

Conclusion: La boucle la plus efficace est C (for(i = 1; i < n; i *= 2)), avec une complexité de O(log n), car elle effectue beaucoup moins d'itérations que les autres boucles qui ont une complexité de O(n).

 

6. Qu'est-ce que cela signifie quand on dit qu'un algorithme X est asymptotiquement plus efficace que Y?

A X sera un meilleur choix pour toutes les entrées

B X sera un meilleur choix pour toutes les entrées sauf les petites entrées

C X sera un meilleur choix pour toutes les entrées sauf les grandes entrées

D Y sera un meilleur choix pour les petits entrées

B
Lorsqu'on dit qu'un algorithme X est asymptotiquement plus efficace que l'algorithme Y, cela signifie que, à mesure que la taille de l'entrée (n) devient grande, l'algorithme X est plus rapide ou utilise moins de ressources que Y. Cependant, pour les petites tailles d'entrée, l'algorithme Y pourrait être plus rapide, car les constantes et les facteurs d'implémentation dans X pourraient avoir un impact plus important.

Ainsi, X sera généralement plus efficace que Y pour les grandes entrées, mais pour les petites entrées, cela pourrait ne pas être le cas.

 

7. La complexité de l'algorithme de tri à bulles est _____?

A O(n)

B O(log n)

C O(n2)

D O(n * log n)

C
L'algorithme de tri à bulles (ou bubble sort) a une complexité temporelle de O(n²) dans le pire des cas. Cela est dû à deux boucles imbriquées qui parcourent la liste et comparent les éléments, ce qui donne une complexité quadratique.

 

8. Quelle est la complexité temporelle de l’algorithme de Floyd-Warshall pour calculer tous les chemins les plus courts d’une paire dans un graphe à n sommets?

A O(n ^ 2logn)

B Θ(n ^ 2logn)

C Θ(n ^ 4)

D Θ(n ^ 3)

D
L'algorithme Floyd – Warshall utilise trois boucles imbriquées pour calculer tous les chemins les plus courts. Donc, la complexité temporelle est Θ(n ^ 3).

 

9. La déclaration log(n!) = Θ(n * log n) est-elle valide?

A Vrai

B Faux

A
La déclaration log(n!) = Θ(n * log n) est effectivement valide. L'expression log(n!) (logarithme de n factoriel) peut être approximée à l'aide de la formule de Stirling, qui dit que n! ≈ √(2πn) (n/e)^n. En prenant le logarithme de cette approximation, on obtient: log(n!) ≈ nlog(n)−n

Cela montre que log(n!) est asymptotiquement équivalent à Θ(n log n), car le terme -n devient négligeable par rapport à n log n à grande échelle. Par conséquent, log(n!) = Θ(n * log n) est valide.

 

10. Les tableaux sont les meilleures structures de données

A Pour les collections de données relativement permanentes

B Pour les collections de données dont la structure changent constamment

C Tout les réponses sont vrais

D Aucun de ces réponses

A
Les tableaux sont particulièrement adaptés aux collections de données relativement permanentes car :

  • Ils permettent un accès rapide aux éléments par index (O(1)), ce qui est avantageux lorsque la taille des données ne change pas fréquemment.
  • Les tableaux ont une taille fixe, donc ils ne sont pas idéaux pour des collections où les données changent fréquemment ou dont la taille varie de manière dynamique (ce qui est plus adapté aux structures comme les listes chaînées).

En revanche, les tableaux ne sont pas bien adaptés pour des données dont la structure change fréquemment (ajout, suppression d'éléments, etc.), car ces opérations peuvent être coûteuses (par exemple, O(n) dans le pire des cas pour l'ajout ou la suppression d'un élément dans un tableau).

Donc, les tableaux sont plus efficaces pour des données relativement permanentes, mais pas pour des collections dynamiques.

 

2 réflexions sur “QCM Algorithmes, structures de données et complexité – Partie 6

  • juillet 8, 2021 à 3:16 pm
    Permalien

    Je vous remercie énormement pour votre site . Que le meilleur me soit enseigner par votre site.

    Répondre

Laisser un commentaire

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