<?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</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 (temps ou mémoire) consommée par un algorithme en fonction de la taille de l'entrée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on étudie comment le coût<br/>
évolue lorsque la taille n grandit.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La beauté du code</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Subjectif, sans rapport.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La difficulté de comprendre le code</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 (à une constante près)</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 n octets de mémoire</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>Double boucle = O(n²). Astuce : on peut faire<br/>
mieux ici en O(n) avec un set (test<br/>
d'appartenance en O(1)).</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] = O(1) ; cible in liste<br/>
= O(n) ; liste.append(x) = O(1) en moyenne ;<br/>
liste.insert(0, x) = 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,<br/>
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 faire les énoncés plus longs</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La distinction des trois<br/>
cas a une véritable raison<br/>
mathématique : la complexité<br/>
d'un algorithme peut varier<br/>
fortement selon les données<br/>
en entrée, et il faut donc<br/>
préciser quel scénario on<br/>
analyse.</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 de l'entrée, pas seulement de sa 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 l'ordinateur a parfois la flemme</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un ordinateur exécute<br/>
systématiquement les<br/>
instructions qui lui<br/>
sont fournies. La variation<br/>
de coût provient de<br/>
l'algorithme et des données,<br/>
pas du matériel.</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 = 1000</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : intermédiaire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>2ⁿ ≈ 10³⁰¹ (un nombre de plus de 300 chiffres)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : 2¹⁰⁰⁰ est astronomiquement<br/>
plus grand que 10⁶ ou 10³. C'est pourquoi<br/>
on é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² = 1 000 000</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est grand mais pas le plus grand.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>log₂(n) ≈ 10</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est la valeur la plus petite<br/>
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<br/>
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<br/>
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<br/>
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) (et non O(2n), car les constantes sont absorbées)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : 2n est un O(n). On n'écrit<br/>
jamais O(2n), seulement O(n).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(n × m) où m = n</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est O(n + n) = O(2n) = 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 d'une liste</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : O(n).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La recherche linéaire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : O(n).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La recherche dichotomique</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 (fusion, rapide, Timsort)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : les tris « diviser pour<br/>
régner » atteignent O(n log n), prouvée<br/>
optimale pour les tris 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 prennent trop de place sur le disque</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La consommation mémoire n'est pas la<br/>
raison principale.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce qu'ils n'existent pas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ils existent (par exemple,<br/>
énumérer tous les sous-ensembles).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Parce que pour n modeste (n = 50), 2ⁿ ≈ 10¹⁵, ce qui est hors d'atteinte même sur un super-calculateur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la croissance<br/>
exponentielle rend impraticable un<br/>
algorithme dès que n dépasse quelques<br/>
dizaines.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce qu'ils sont mal écrits</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 : règle d'or, un PC<br/>
moderne effectue grosso modo 10⁸ à 10⁹<br/>
opérations Python par seconde. 10⁹ ≈<br/>
quelques secondes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Plusieurs années</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : valeur attendue pour ~ 10¹⁵<br/>
opérations.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Plusieurs jours</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on aurait dépassé largement les 10⁹<br/>
opérations.</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 les deux</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 et l'algorithme « plus simple » peut être plus rapide</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>Cela dépend de la couleur de l'écran</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La complexité d'un<br/>
algorithme est une<br/>
mesure mathématique<br/>
intrinsèque, indépendante<br/>
de l'affichage. Elle ne<br/>
dépend que du nombre<br/>
d'opérations effectuées<br/>
en fonction de la taille<br/>
d'entrée.</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 — Q24 : Inclusion des classes</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Une fonction en O(n) est-elle forcément aussi<br/>
en O(n²) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>C'est pour cela qu'on dit « la complexité<br/>
<strong>est</strong> O(n²) » plutôt que « la complexité<br/>
<strong>vaut</strong> O(n²) » : c'est un majorant. La<br/>
borne <strong>serrée</strong> s'écrit Θ(n²) (« thêta »),<br/>
hors programme NSI.</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>Non, ce sont des classes différentes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : O(n²) inclut O(n).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Oui : O(n²) est une borne supérieure plus large, qui inclut O(n)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : O(f) signifie « majoré par<br/>
c × f ». Si f croît plus vite que g (au<br/>
sens asymptotique), alors O(g) ⊆ O(f).<br/>
Donc O(n) ⊆ O(n²) ⊆ O(n³)...</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Oui, mais seulement pour des n positifs</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Précision inutile : la complexité s'étudie<br/>
pour n grand.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Non, sauf si n est petit</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la propriété est asymptotique.</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 n</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Réponse partielle : c'est faux. À 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) car n est une simple variable</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 n (autrement dit, linéaire en fonction du nombre de chiffres)</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<br/>
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²)</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/>
pop() (en fin) en O(1) amorti ; insert(0,<br/>
x), pop(0), remove, in en O(n). Ces<br/>
ordres de grandeur déterminent le choix de la<br/>
structure de données pour un algorithme<br/>
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>liste.insert(0, x) (insertion en tête)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : insérer en tête oblige à<br/>
<strong>décaler tous les éléments existants</strong><br/>
d'une case vers la droite, ce qui coûte<br/>
O(n). Sur une liste de un million<br/>
d'éléments, c'est très lent. Pour un usage<br/>
intensif d'insertion en tête, utiliser un<br/>
collections.deque (O(1)).</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>
