<?xml version="1.0" encoding="UTF-8"?>
<quiz>
<question type="category">
  <category>
    <text>$course$/QCM de NSI/Première/Complexité algorithmique</text>
  </category>
  <info format="html">
    <text><![CDATA[<p>Notion de complexité asymptotique, notation O, classes<br/>
classiques (constante, logarithmique, linéaire, quasi<br/>
linéaire, quadratique, exponentielle), calcul à partir<br/>
du code, comparaison expérimentale, échelle de<br/>
croissance.</p>]]></text>
  </info>
</question>

<question type="multichoice">
  <name>
    <text>Complexité algorithmique — Q01 : Définition de la complexité</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que mesure la <strong>complexité algorithmique</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Deux types de complexité : <strong>temporelle</strong> (nombre<br/>
d'opérations) et <strong>spatiale</strong> (mémoire utilisée).<br/>
En NSI Première, on s'intéresse surtout à la<br/>
complexité temporelle.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le nombre de lignes de code source nécessaires pour écrire l'algorithme</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la complexité algorithmique mesure<br/>
l'évolution des <strong>ressources</strong> (temps,<br/>
mémoire), pas la longueur du code.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La quantité de ressources consommée selon la taille de l'entrée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on étudie comment le coût<br/>
(temps de calcul, mémoire) évolue lorsque la<br/>
taille n de l'entrée grandit.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le temps d'exécution en secondes, mesuré sur une machine donnée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la complexité ne dépend ni de la<br/>
machine ni du langage. Elle compte des<br/>
opérations élémentaires en fonction de la<br/>
taille n, pas des secondes sur un ordinateur<br/>
particulier.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La difficulté qu'a un lecteur humain à comprendre le code source</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est la « complexité cognitive », notion<br/>
différente, non quantifiée formellement en<br/>
NSI.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Complexité algorithmique — Q02 : Notation O</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que signifie l'écriture O(n) (« grand O de n ») ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>O(n) caractérise une famille de fonctions qui<br/>
croissent au plus comme c × n pour une constante<br/>
c. C'est une notation d'ordre de grandeur.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>L'algorithme effectue exactement n opérations</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : O(n) est une borne <strong>asymptotique</strong>,<br/>
pas un compte exact. L'algorithme peut faire<br/>
2n + 5 opérations, on note O(n).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Le nombre d'opérations croît proportionnellement à n</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : O(n) signifie « linéaire ».<br/>
Doubler n double approximativement le temps.<br/>
Les constantes et les termes d'ordre<br/>
inférieur sont ignorés.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>L'algorithme utilise exactement n octets de mémoire vive</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>O(n) peut s'appliquer à la mémoire, mais ce<br/>
n'est pas une définition générale.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>L'algorithme se termine en moins de n secondes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : O ne mesure pas un temps absolu mais<br/>
une <strong>proportion</strong>.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Complexité algorithmique — Q03 : Classes classiques</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Parmi les complexités suivantes, laquelle est la<br/>
<strong>plus rapide</strong> asymptotiquement ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Hiérarchie classique (du plus rapide au plus<br/>
lent) : O(1) &lt; O(log n) &lt; O(n) &lt; O(n log n) &lt;<br/>
O(n²) &lt; O(n³) &lt; O(2ⁿ) &lt; O(n!).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(n²)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : quadratique, l'une des plus lentes<br/>
dans cette liste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(n log n)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne, mais pas la plus rapide.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>O(log n)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : logarithmique. Pour n = 10⁶,<br/>
log₂(n) ≈ 20. C'est la complexité de la<br/>
recherche dichotomique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(n)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Linéaire : plus rapide que quadratique mais<br/>
plus lente que logarithmique.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Complexité algorithmique — Q04 : Boucle simple</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la complexité de cette fonction en<br/>
fonction de n = len(liste) ?<br/>
`<code>python<br/>
def somme(liste):<br/>
    total = 0<br/>
    for x in liste:<br/>
        total += x<br/>
    return total<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Règle pratique : une boucle imbriquée 0 fois<br/>
→ O(1) ; 1 fois → O(n) ; 2 fois → O(n²) ; etc.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(log n)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun mécanisme dichotomique ici.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(1)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la boucle dépend de la taille de<br/>
la liste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>O(n)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : une boucle simple sur n<br/>
éléments avec une opération constante par<br/>
itération donne O(n).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(n²)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas de double boucle.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Complexité algorithmique — Q05 : Double boucle</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la complexité de cette fonction ?<br/>
`<code>python<br/>
def doublons(liste):<br/>
    n = len(liste)<br/>
    for i in range(n):<br/>
        for j in range(n):<br/>
            if i != j and liste[i] == liste[j]:<br/>
                return True<br/>
    return False<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Deux boucles imbriquées donnent O(n²). Astuce :<br/>
on peut faire mieux ici en O(n) avec un seul<br/>
parcours qui note dans un dictionnaire les<br/>
valeurs déjà vues, car le test x in vues sur<br/>
les clés d'un dictionnaire est en O(1) en<br/>
moyenne.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(n)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le for j in range(n) imbriqué<br/>
ajoute un facteur n.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(1)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : double boucle, donc dépend de n.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(n!)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : factorielle, c'est la complexité<br/>
d'algorithmes énumérant toutes les<br/>
permutations.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>O(n²)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : deux boucles imbriquées sur<br/>
n éléments donnent n × n = n² opérations<br/>
au pire.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Complexité algorithmique — Q06 : Constante</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la complexité de l'accès liste[i]<br/>
sur une <strong>liste Python</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Distinguer : liste[i] est en O(1) ;<br/>
cible in liste est en O(n) ; liste.append(x)<br/>
est en O(1) en moyenne ; insérer un élément en<br/>
tête de liste, en revanche, oblige à décaler<br/>
tous les autres et coûte O(n).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(n²)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un accès par indice est trivial.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(log n)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune dichotomie nécessaire,<br/>
accès direct.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(n)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pour une list Python, l'accès par<br/>
indice est immédiat, on n'a pas besoin de<br/>
parcourir la liste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>O(1)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : les listes Python sont des<br/>
tableaux, l'accès par indice est en temps<br/>
constant indépendamment de la taille.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Complexité algorithmique — Q07 : Taille de l'entrée</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour une liste, qu'est-ce que la « taille de<br/>
l'entrée » n ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Selon le contexte, la « taille » peut être<br/>
différente : nombre de chiffres pour un entier,<br/>
nombre de pixels pour une image, nombre de lignes<br/>
pour un fichier, etc.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le numéro de ligne où la liste est définie</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le numéro de ligne du<br/>
code source ne joue<br/>
aucun rôle dans le coût<br/>
d'exécution. La taille<br/>
d'entrée caractérise le<br/>
volume de données traité,<br/>
ici le nombre d'éléments.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La valeur du plus grand élément</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la complexité ne dépend<br/>
généralement pas des <strong>valeurs</strong>, mais de<br/>
la <strong>structure</strong>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La quantité de mémoire qu'elle occupe en octets</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est lié, mais pas la définition standard.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Le nombre d'éléments de la liste (sa longueur)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la taille pertinente pour<br/>
la complexité d'une liste est sa longueur.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Complexité algorithmique — Q08 : Pire / moyen / meilleur cas</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi distingue-t-on <strong>pire cas, cas moyen, meilleur cas</strong> dans l'analyse de complexité ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>En général, on retient le <strong>pire cas</strong> comme<br/>
référence : il garantit qu'au-delà, le coût ne<br/>
dépassera pas. Le cas moyen est utile pour<br/>
l'analyse fine en pratique.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour pouvoir annoncer la complexité la plus avantageuse</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on ne choisit pas le cas qui<br/>
arrange. En pratique, on retient le<br/>
<strong>pire cas</strong>, car il fournit une<br/>
garantie valable pour toutes les<br/>
entrées possibles.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que les langages de programmation diffèrent</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Sans rapport : la complexité est<br/>
intrinsèque à l'algorithme.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Parce que la complexité peut dépendre du contenu, pas seulement de la taille</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : pour le tri par insertion,<br/>
une liste déjà triée donne O(n), une liste<br/>
renversée donne O(n²). Le pire cas est le<br/>
plus important pour les garanties.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que le résultat renvoyé change selon les données</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : confusion entre coût et<br/>
correction. Un algorithme correct<br/>
renvoie le bon résultat dans tous<br/>
les cas ; ce qui varie d'un cas à<br/>
l'autre, c'est le <strong>nombre<br/>
d'opérations</strong> effectuées, pas le<br/>
résultat.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Complexité algorithmique — Q09 : Échelle de croissance</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour n = 1000, qui est le plus grand ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Échelle pour n = 1000 : log n = 10, n = 10³,<br/>
n² = 10⁶, 2ⁿ ≈ 10³⁰¹. Différence colossale.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>n</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : n = 1000 = 10³, valeur<br/>
intermédiaire parmi les quatre.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>2ⁿ</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : 2¹⁰⁰⁰ ≈ 10³⁰¹, un nombre de<br/>
plus de 300 chiffres, astronomiquement plus<br/>
grand que 10⁶ ou 10³. C'est pourquoi on<br/>
évite à tout prix les algorithmes<br/>
exponentiels sur de grandes entrées.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>n²</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : n² = 10⁶, c'est grand mais très<br/>
loin derrière l'exponentielle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>log₂(n)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : log₂(1000) ≈ 10, c'est la valeur<br/>
la plus petite des quatre.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Complexité algorithmique — Q10 : Recherche</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la complexité de la <strong>recherche dichotomique</strong> dans une liste triée ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Hiérarchie classique : O(log n) (dichotomie)<br/>
&lt;&lt; O(n) (parcours simple) &lt;&lt; O(n²) (double<br/>
parcours) &lt;&lt; O(2ⁿ) (énumération exponentielle).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(n)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est la recherche <strong>linéaire</strong>,<br/>
pas dichotomique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>O(log n)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : à chaque étape, on divise<br/>
la liste en deux. C'est la complexité de<br/>
référence pour les algorithmes de<br/>
dichotomie.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(n²)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun double parcours.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(1)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on doit comparer plusieurs<br/>
éléments dans le pire cas.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Complexité algorithmique — Q11 : Boucles imbriquées</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la complexité de :<br/>
`<code>python<br/>
for i in range(n):<br/>
    for j in range(n):<br/>
        for k in range(n):<br/>
            print(i, j, k)<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Règle simple : pour des boucles imbriquées<br/>
sur n, la complexité est n^(profondeur).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(n)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : trois boucles imbriquées.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(n²)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est deux boucles imbriquées,<br/>
pas trois.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(3n)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait trois boucles <strong>non imbriquées</strong>, soit O(n).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>O(n³)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : trois boucles imbriquées<br/>
sur n donnent n × n × n = n³ opérations.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Complexité algorithmique — Q12 : Deux boucles séparées</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la complexité de :<br/>
`<code>python<br/>
for i in range(n):<br/>
    print(i)<br/>
for j in range(n):<br/>
    print(j)<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Règle : O(f) + O(g) = O(max(f, g)). La<br/>
complexité d'une séquence est dominée par sa<br/>
partie la plus coûteuse.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(2)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le coût dépend de n.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(n²)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : les boucles ne sont <strong>pas imbriquées</strong>, on les additionne, on ne les<br/>
multiplie pas.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>O(n)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : n + n = 2n opérations, et 2n<br/>
est un O(n), les constantes sont absorbées.<br/>
On n'écrit jamais O(2n), seulement O(n).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(n log n)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune division du problème ni tri<br/>
ici, seulement deux parcours successifs de n<br/>
tours. Le total vaut 2n, c'est un O(n).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Complexité algorithmique — Q13 : Termes dominants</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la complexité de l'expression<br/>
T(n) = 3n² + 100n + 50 ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Règle systématique : ne garder que le terme<br/>
le plus puissant et supprimer la constante<br/>
multiplicative. C'est l'essence de la notation<br/>
asymptotique.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(3n²)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on n'écrit pas la constante<br/>
multiplicative dans la notation O.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>O(n²)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : le terme <strong>dominant</strong> pour<br/>
n grand est 3n². Les autres termes (100n,<br/>
50) deviennent négligeables.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(50)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 50 est une constante mais elle est<br/>
dominée par les termes en n.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(100n)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on n'écrit pas la constante. De<br/>
plus, c'est dominé par n².</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Complexité algorithmique — Q14 : Doublement de la taille</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Un algorithme en O(n²) traite n = 1000<br/>
éléments en 1 seconde. Combien de temps lui<br/>
faudra-t-il pour n = 2000 ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Compétence essentielle : extrapoler le temps<br/>
d'exécution. Cela permet d'<strong>anticiper</strong> si un<br/>
algorithme va supporter la charge.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>1 seconde (le temps ne change pas)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait O(1).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>4 secondes (n doublé → temps quadruplé)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : O(n²) signifie temps ∝ n².<br/>
Doubler n multiplie le temps par 4<br/>
(= 2²). Tripler n multiplierait par 9<br/>
(= 3²).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>1000 secondes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Surestimation grossière.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>2 secondes (n doublé → temps doublé)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait O(n).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Complexité algorithmique — Q15 : Pire vs meilleur cas</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>La recherche linéaire est en O(n) au pire et<br/>
O(1) au meilleur. Que dire si l'on parle de<br/>
« complexité » sans précision ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le pire cas a une signification claire et<br/>
garantit la performance « au pire ». Le cas<br/>
moyen demanderait de modéliser la<br/>
distribution de probabilité des entrées.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>On parle du cas moyen</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Pas la convention standard, sauf<br/>
précision.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>On parle implicitement du meilleur cas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : par convention, on prend le pire<br/>
cas si rien n'est précisé.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>On parle du cas le plus probable</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Pas une notion bien définie sans modèle<br/>
probabiliste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>On parle implicitement du pire cas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est la convention en NSI<br/>
et plus largement. Le pire cas garantit<br/>
une borne supérieure.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Complexité algorithmique — Q16 : Complexité spatiale</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la complexité <strong>spatiale</strong> (mémoire<br/>
additionnelle) du tri par insertion ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Distinction temps / espace : le tri par<br/>
insertion est lent (O(n²) en temps) mais<br/>
économe en mémoire (O(1) en espace). Le tri<br/>
fusion est rapide (O(n log n)) mais coûteux<br/>
en mémoire (O(n)).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>O(1)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : tri en place, ne nécessite<br/>
que quelques variables temporaires<br/>
indépendamment de n.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(n²)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on n'alloue pas de tableau 2D.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(log n)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas de mécanisme dichotomique ici<br/>
(la boucle parcourt n éléments).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(n)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on ne crée pas de copie de la<br/>
liste.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Complexité algorithmique — Q17 : O(n log n)</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour quel type d'algorithme la complexité<br/>
O(n log n) est-elle typique ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>O(n log n) ≈ O(n) sur de petites entrées,<br/>
mais bien meilleur que O(n²) sur de grandes.<br/>
Pour n = 10⁶ : n log n ≈ 2 × 10⁷, n² = 10¹².<br/>
Différence colossale.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le calcul de la somme des éléments d'une liste</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un seul parcours, O(n).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La recherche linéaire d'un élément dans une liste</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un seul parcours, O(n).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La recherche dichotomique dans une liste triée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la recherche dichotomique est en<br/>
O(log n), pas O(n log n).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Les tris efficaces, comme le tri fusion</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : les tris « diviser pour<br/>
régner » (tri fusion, tri rapide) et le<br/>
Timsort de Python atteignent O(n log n),<br/>
complexité prouvée optimale pour les tris<br/>
par comparaisons.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Complexité algorithmique — Q18 : Algorithmes exponentiels</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi évite-t-on les algorithmes en O(2ⁿ) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un algorithme exponentiel sur n = 100 prendrait<br/>
des milliards d'années même sur le meilleur<br/>
ordinateur du monde. Pour ces problèmes, on<br/>
utilise des heuristiques ou des algorithmes<br/>
approchés.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce qu'ils occupent trop de place sur le disque dur de la machine</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'espace de stockage n'est pas en cause :<br/>
c'est le temps de calcul qui devient<br/>
prohibitif.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce qu'aucun problème concret ne conduit à un tel algorithme</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ils existent bel et bien, par<br/>
exemple pour énumérer tous les sous-ensembles<br/>
d'un ensemble de n éléments.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Parce que leur coût explose dès que n atteint quelques dizaines</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : pour n = 50, 2ⁿ ≈ 10¹⁵<br/>
opérations, hors d'atteinte même sur un<br/>
super-calculateur. La croissance<br/>
exponentielle rend l'algorithme impraticable<br/>
dès que n dépasse quelques dizaines.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce qu'ils résultent presque toujours d'une programmation maladroite</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un algorithme exponentiel peut être<br/>
parfaitement écrit, c'est sa <strong>structure</strong><br/>
qui pose problème.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Complexité algorithmique — Q19 : Estimer un temps</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Un algorithme effectue 10⁹ opérations<br/>
élémentaires. Sur un PC moderne (~ 10⁹<br/>
opérations / seconde), combien de temps<br/>
attendra-t-on ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Repère mental : 10⁸ par seconde en Python (un<br/>
peu lent), 10⁹ ou plus en C/C++. Permet<br/>
d'anticiper si un algorithme passera ou non<br/>
la contrainte de temps.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Environ une seconde</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : 10⁹ opérations à<br/>
~ 10⁹ opérations par seconde donnent<br/>
environ une seconde (et plutôt<br/>
quelques secondes en Python, qui<br/>
tourne autour de 10⁸ par seconde).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Plusieurs années</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : à 10⁹ opérations par seconde, une<br/>
année représente environ 3 × 10¹⁶<br/>
opérations. Plusieurs années correspondent<br/>
donc à ~ 10¹⁷ opérations, très loin de 10⁹.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Plusieurs jours</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une journée représente environ<br/>
10¹⁴ opérations à cette vitesse. Pour 10⁹<br/>
opérations, le calcul donne 10⁹ / 10⁹ = 1<br/>
seconde.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Quelques nanosecondes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 10⁹ opérations à 10⁹/s = 1<br/>
seconde, pas une nanoseconde.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Complexité algorithmique — Q20 : Petit vs grand n</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour n petit (n = 10), un algorithme O(n²) est-il<br/>
forcément moins efficace qu'un O(n log n) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Maxime : « la notation O est asymptotique ».<br/>
Pour les petits n, des constantes plus petites<br/>
peuvent compenser un ordre de grandeur plus<br/>
grand. Asymptotiquement, l'ordre l'emporte.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucun rapport entre ces deux complexités</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : asymptotiquement, O(n log n) bat<br/>
O(n²).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Oui, O(n²) est toujours moins efficace</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la notation O cache des<br/>
<strong>constantes</strong> qui peuvent renverser le<br/>
classement sur les petites entrées.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Non : sur les petites entrées, les constantes peuvent dominer</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : Python utilise Timsort<br/>
(n log n) mais bascule sur le tri par<br/>
insertion (O(n²)) pour les sous-tableaux<br/>
de moins de ~ 64 éléments. Preuve par la<br/>
pratique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Non, car pour n = 10 les deux donnent le même nombre d'opérations</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur de calcul : pour n = 10,<br/>
n² = 100 alors que<br/>
n log₂ n ≈ 33. Les deux ordres<br/>
de grandeur ne coïncident pas ;<br/>
la vraie raison est que la<br/>
notation O cache des constantes<br/>
multiplicatives qui peuvent<br/>
renverser le classement.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Complexité algorithmique — Q21 : Analyse fine</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la complexité de :<br/>
`<code>python<br/>
def f(n):<br/>
    for i in range(n):<br/>
        for j in range(i):<br/>
            print(i, j)<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Astuce : même si la boucle interne ne va pas<br/>
jusqu'à n, la somme reste en n². Cas typique<br/>
des tris en O(n²).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>O(n²)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la boucle interne fait i<br/>
itérations. Total = 0 + 1 + ... + (n-1)<br/>
= n(n-1)/2 ≈ n²/2. C'est O(n²).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(n log n)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun mécanisme dichotomique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(n)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : double boucle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(n³)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : trois boucles imbriquées<br/>
donneraient n³.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Complexité algorithmique — Q22 : Boucle qui divise</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Une boucle parcourt une variable n en la<br/>
<strong>divisant par 2</strong> à chaque tour, jusqu'à<br/>
atteindre 1 (à chaque tour, travail<br/>
constant). Quel est le coût total ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Schéma caractéristique : à chaque itération,<br/>
la quantité de travail restant est divisée<br/>
par 2. Donne un coût logarithmique. C'est<br/>
l'analyse de la recherche dichotomique.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Quadratique</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun double parcours.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Constant</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il y a plusieurs tours.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Logarithmique</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on passe de n à n/2 à n/4<br/>
à ... à 1, soit log₂(n) étapes. C'est<br/>
exactement le coût de la dichotomie.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Linéaire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on divise par 2, pas par<br/>
soustraction de 1.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Complexité algorithmique — Q23 : Mesure empirique</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour vérifier la complexité d'un algorithme<br/>
empiriquement, on mesure son temps t pour<br/>
différentes tailles n. Si t est<br/>
proportionnel à n², comment cela apparaît-il<br/>
sur un graphique log-log (axes logarithmiques) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Astuce expérimentale : tracer en log-log et<br/>
mesurer la pente. C'est ainsi qu'on confirme<br/>
visuellement la complexité d'un algorithme<br/>
en pratique.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une parabole</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est ce qu'on aurait sur des axes<br/>
linéaires, pas logarithmiques.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une courbe exponentielle</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : sur un graphe log-log, n²<br/>
apparaît linéaire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une droite de pente 2</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : si t = c × n², alors<br/>
log(t) = log(c) + 2 × log(n). C'est une<br/>
droite de pente 2 sur un graphe log-log.<br/>
Pour une complexité O(n^k), la pente est<br/>
exactement k.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une horizontale</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait pour O(1).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Complexité algorithmique — Q25 : Synthèse</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Parmi les affirmations suivantes sur la<br/>
complexité, laquelle est <strong>fausse</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Maxime : « la complexité asymptotique est un<br/>
guide, pas une vérité absolue ». Il faut<br/>
toujours tester en pratique pour les cas<br/>
réels, surtout sur de petites entrées.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La complexité spatiale mesure la mémoire additionnelle utilisée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : c'est sa définition.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un algorithme O(n) est toujours plus rapide qu'un algorithme O(n²)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Faux (donc bonne réponse) : O(n) est plus<br/>
rapide <strong>asymptotiquement</strong>, mais sur de<br/>
petites entrées un O(n²) avec une petite<br/>
constante peut battre un O(n) avec une<br/>
grosse constante. Exemple : Timsort<br/>
bascule sur du tri par insertion pour<br/>
n &lt; 64.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour les boucles imbriquées, on multiplie les complexités ; pour les séquences, on prend le maximum</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : règle de calcul standard.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La complexité O ignore les constantes multiplicatives</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : O(2n) = O(n) = O(100n).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Complexité algorithmique — Q26 : Boucle while soustractive</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la complexité de la fonction<br/>
suivante en fonction de n ?<br/>
`<code>python<br/>
def f(n):<br/>
    while n &gt; 0:<br/>
        print(n)<br/>
        n = n - 3<br/>
</code>`</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>À retenir : soustraire une constante à n à<br/>
chaque itération donne un coût linéaire ;<br/>
diviser n par une constante donne un coût<br/>
logarithmique. Cette distinction est la clé<br/>
pour reconnaître les algorithmes<br/>
logarithmiques.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(log n)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la division par deux donne du<br/>
logarithmique. Ici on <strong>soustrait</strong> une<br/>
constante à chaque tour, donc le nombre<br/>
d'itérations est proportionnel à n, pas à<br/>
log n.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(1)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le nombre d'itérations dépend<br/>
clairement de n. Pour n = 30, la boucle<br/>
tourne dix fois ; pour n = 300, elle<br/>
tourne cent fois. Ce n'est pas constant.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>O(n)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : n décroît par pas de 3.<br/>
Le nombre d'itérations vaut environ n / 3,<br/>
ce qui est O(n) car on absorbe la constante<br/>
multiplicative. Toute boucle while qui<br/>
soustrait une constante à n est en O(n).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(n²)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il n'y a pas de double boucle. Le<br/>
coût est dominé par le nombre d'itérations<br/>
de l'unique while.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Complexité algorithmique — Q27 : Taille vs valeur de l'entrée</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On considère la fonction qui compte les<br/>
chiffres d'un entier positif :<br/>
`<code>python<br/>
def chiffres(n):<br/>
    c = 0<br/>
    while n &gt; 0:<br/>
        n = n // 10<br/>
        c += 1<br/>
    return c<br/>
</code>`<br/>
Quelle est sa complexité ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Subtilité importante : la « taille » d'un<br/>
entier n est son <strong>nombre de chiffres</strong>,<br/>
donc de l'ordre de log(n). Les algorithmes<br/>
classiques sur les entiers sont dits<br/>
« linéaires » quand leur coût est<br/>
proportionnel au nombre de chiffres, c'est-à-<br/>
dire O(log n) en fonction de la valeur.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(n) en fonction de la valeur de n</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : à chaque<br/>
itération, n est divisé par 10. Donc le<br/>
nombre d'itérations est de l'ordre de<br/>
log₁₀(n), pas de n. Pour n = 10⁶, la<br/>
boucle ne tourne que sept fois, pas un<br/>
million.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(1) quelle que soit la valeur de n</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la boucle dépend de la valeur de<br/>
n. Plus n est grand, plus elle tourne<br/>
longtemps.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>O(log n) en fonction de la valeur de n</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on divise n par 10 à<br/>
chaque itération, donc log₁₀(n) étapes.<br/>
C'est aussi exactement le <strong>nombre de chiffres</strong> de n dans son écriture<br/>
décimale. Une autre façon de le dire : la<br/>
complexité est <strong>linéaire</strong> par rapport à<br/>
la <strong>taille</strong> (nombre de chiffres) de n.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(n²) en fonction de la valeur de n</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune double boucle ni structure<br/>
quadratique. Le coût ne grandit pas comme<br/>
n².</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Complexité algorithmique — Q28 : Coût des opérations sur les listes</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Parmi ces opérations sur une liste Python de<br/>
taille n, laquelle est la plus <strong>coûteuse</strong><br/>
au pire ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Repères à connaître pour les listes Python :<br/>
accès par indice et len en O(1) ; append<br/>
en O(1) amorti ; x in liste, max, min et<br/>
sum en O(n), car ils parcourent toute la<br/>
liste au pire. Ces ordres de grandeur<br/>
déterminent le choix de la structure de<br/>
données pour un algorithme donné.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>liste[0] (lecture du premier élément)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'accès par indice est en O(1) sur<br/>
une liste Python (qui est en réalité un<br/>
tableau dynamique). Pas besoin de<br/>
parcourir.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>x in liste (test de présence)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : le test de présence est une<br/>
recherche linéaire cachée. Python compare<br/>
x à chaque élément jusqu'à le trouver ; si<br/>
la valeur est absente, il parcourt les n<br/>
éléments, d'où un coût en O(n) au pire. Un<br/>
in répété sur une liste d'un million<br/>
d'éléments devient très lent.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>liste.append(x) (ajout en fin)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : append est en O(1) en moyenne. Une<br/>
réallocation occasionnelle peut prendre<br/>
plus de temps, mais le <strong>coût amorti</strong> par<br/>
opération reste constant.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>len(liste) (longueur de la liste)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : len est en O(1). Python stocke la<br/>
longueur dans un attribut de la liste, pas<br/>
besoin de compter à chaque appel.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Complexité algorithmique — Q29 : Choisir selon la taille</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Sur un PC moderne, on dispose d'<strong>une seconde</strong><br/>
pour exécuter un algorithme (~ 10⁸ opérations<br/>
Python). Quelle est la <strong>plus grande taille</strong><br/>
d'entrée que l'on peut traiter avec un<br/>
algorithme en O(n²) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Repères de seuils pratiques (1 seconde de<br/>
calcul, ~ 10⁸ opérations) : O(2ⁿ) → n ≈ 25 ;<br/>
O(n³) → n ≈ 500 ; O(n²) → n ≈ 10⁴ ; O(n log<br/>
n) → n ≈ 10⁶ ; O(n) → n ≈ 10⁸ ; O(log n) → n<br/>
gigantesque. Indispensable pour évaluer la<br/>
faisabilité d'un algorithme avant de<br/>
l'écrire.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Environ 30 (trentaine)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait pour un algorithme<br/>
exponentiel O(2ⁿ). Avec n = 30, on a<br/>
déjà 10⁹ opérations, soit la limite. Mais<br/>
pour quadratique, on peut traiter<br/>
beaucoup plus.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Environ 10⁸ (cent millions)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait pour un algorithme en<br/>
O(n) (linéaire). Pour un algorithme<br/>
quadratique, il faut prendre la racine<br/>
carrée du budget d'opérations.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Environ 10⁴ (dix mille)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on cherche n tel que<br/>
n² ≤ 10⁸, donc n ≤ √(10⁸) = 10⁴. À<br/>
retenir : un algorithme quadratique<br/>
devient lent dès quelques dizaines de<br/>
milliers d'éléments. Comparer avec O(n<br/>
log n) qui supporte plusieurs millions.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Environ 10⁶ (un million)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pour n = 10⁶, un algorithme<br/>
quadratique fait 10¹² opérations, ce qui<br/>
prendrait environ trois heures. Hors<br/>
budget.</p>]]></text>
    </feedback>
  </answer>
</question>

</quiz>
