<?xml version="1.0" encoding="UTF-8"?>
<quiz>
<question type="category">
  <category>
    <text>$course$/QCM de NSI/Première/Recherche dichotomique</text>
  </category>
  <info format="html">
    <text><![CDATA[<p>Recherche dichotomique dans une liste triée, principe<br/>
d'élimination de la moitié, calcul du milieu, indices<br/>
gauche/droite, coût logarithmique, implémentation<br/>
itérative, terminaison à l'aide d'un variant de boucle,<br/>
pièges classiques (bornes, doublons).</p>]]></text>
  </info>
</question>

<question type="multichoice">
  <name>
    <text>Recherche dichotomique — Q01 : Principe</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel est le principe de la <strong>recherche dichotomique</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>« Dichotomie » vient du grec « di » (deux) +<br/>
« tomos » (couper) : couper en deux. À chaque<br/>
étape, on coupe l'intervalle de recherche par<br/>
deux.</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>Trier la liste avant chaque comparaison</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la liste doit être triée <strong>avant</strong><br/>
la recherche, pas pendant.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Utiliser un dictionnaire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est une autre stratégie (table<br/>
de hachage), pas la dichotomie.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parcourir la liste élément par élément</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est la recherche <strong>linéaire</strong>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Comparer la cible à l'élément du milieu, puis répéter sur la moitié appropriée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : à chaque étape, on <strong>élimine<br/>
la moitié</strong> de la liste, ce qui donne une<br/>
complexité logarithmique.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche dichotomique — Q02 : Précondition</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>La recherche dichotomique exige-t-elle une<br/>
condition particulière sur la liste ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Si la liste n'est pas triée, on ne peut pas<br/>
conclure qu'un élément cherché se trouve « avant »<br/>
ou « après » le milieu. C'est l'hypothèse-clé.</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 liste doit être de taille au moins 100</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune condition de taille minimale.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste doit être de longueur paire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la dichotomie fonctionne sur<br/>
n'importe quelle longueur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste doit contenir uniquement des entiers</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la dichotomie fonctionne sur tout<br/>
type comparable (entiers, flottants, chaînes).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La liste doit être triée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est la condition<br/>
essentielle. Sans tri, la comparaison au<br/>
milieu ne permet pas de savoir dans quelle<br/>
moitié chercher.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche dichotomique — Q03 : Complexité</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la <strong>complexité dans le pire cas</strong> de<br/>
la recherche dichotomique ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour 10⁶ éléments : ~ 20 comparaisons. Pour 10⁹<br/>
éléments : ~ 30 comparaisons. La dichotomie<br/>
passe à l'échelle remarquablement.</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(1)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on doit faire plusieurs comparaisons<br/>
dans le pire cas.</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 : c'est la complexité du tri (par<br/>
fusion ou rapide), pas de la recherche.</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/>
l'intervalle par 2, donc le nombre d'étapes<br/>
est <code>log₂(n)</code>.</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 la complexité de la recherche<br/>
<strong>linéaire</strong>.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche dichotomique — Q04 : Calcul du milieu</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Avec deux indices <code>g</code> (gauche) et <code>d</code> (droite),<br/>
comment calcule-t-on l'<strong>indice du milieu</strong> en<br/>
Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Variante équivalente :<br/>
<code>m = g + (d - g) // 2</code>. C'est plus robuste sur<br/>
certains langages où <code>g + d</code> peut déborder, mais<br/>
en Python (entiers de précision arbitraire),<br/>
<code>(g + d) // 2</code> suffit.</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><code>m = (g + d) // 2</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : moyenne entière des deux<br/>
indices. Le <code>//</code> (division entière) garantit<br/>
un indice valide.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>m = g - d</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : différence, pas milieu.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>m = g + d</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce n'est pas le milieu, c'est la<br/>
somme.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>m = (g + d) / 2</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>/</code> produit un <strong>flottant</strong> en<br/>
Python 3, qui ne peut pas servir d'indice.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche dichotomique — Q05 : Élimination de moitié</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Si la valeur à l'indice du milieu est <strong>plus<br/>
petite</strong> que la cible (et la liste est triée<br/>
croissant), où chercher ensuite ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Dans le code itératif, on fait <code>g = m + 1</code> (et<br/>
non <code>g = m</code>, sinon boucle infinie possible).</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>Dans la moitié droite</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : si le milieu est plus petit<br/>
que la cible, alors toutes les valeurs à<br/>
gauche le sont aussi (liste triée). On peut<br/>
les éliminer.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Dans la moitié gauche</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : à gauche, les valeurs sont <strong>encore<br/>
plus petites</strong> (liste triée croissant).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Dans toute la liste</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'intérêt de la dichotomie est<br/>
précisément d'<strong>éliminer</strong> la moitié.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Au milieu, à nouveau</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on resterait sur la même valeur<br/>
indéfiniment (boucle infinie).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche dichotomique — Q06 : Code itératif</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel code implémente correctement la recherche<br/>
dichotomique itérative (renvoie l'indice ou -1) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Trois mises à jour d'indices selon la<br/>
comparaison : égal (trouvé), inférieur (chercher<br/>
à droite), supérieur (chercher à gauche).</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[<pre><code>def dicho(liste, cible):
    g, d = 0, len(liste)
    while g &lt; d:
        m = (g + d) // 2
        if liste[m] == cible:
            return m
        g = m
        d = m
    return -1</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>g = m</code> et <code>d = m</code> ne réduisent pas<br/>
l'intervalle. Boucle infinie possible.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def dicho(liste, cible):
    for x in liste:
        if x == cible:
            return x
    return -1</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est de la recherche <strong>linéaire</strong>,<br/>
pas dichotomique. Et on renvoie la valeur,<br/>
pas l'indice.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>def dicho(liste, cible):
    g, d = 0, len(liste) - 1
    while g &lt;= d:
        m = (g + d) // 2
        if liste[m] == cible:
            return m
        elif liste[m] &lt; cible:
            g = m + 1
        else:
            d = m - 1
    return -1</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : structure classique avec deux<br/>
indices, mise à jour <code>m + 1</code> ou <code>m - 1</code> pour<br/>
éviter les boucles infinies, retour <code>-1</code> si<br/>
la cible est absente.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def dicho(liste, cible):
    return liste.index(cible)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>list.index</code> fait une recherche<br/>
<strong>linéaire</strong> en interne, et lève une<br/>
exception si absente.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche dichotomique — Q07 : Sortie de boucle</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Dans le code itératif <code>while g &lt;= d:</code>, quand la<br/>
boucle se termine-t-elle si la cible est absente ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>C'est la condition d'arrêt « propre » : tant<br/>
qu'il reste au moins un élément candidat<br/>
(<code>g &lt;= d</code>), on continue ; sinon, élément absent.</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>Quand <code>g == d</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>g == d</code> satisfait encore <code>g &lt;= d</code>,<br/>
la boucle continue.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Au bout de 10 itérations</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune limite fixe d'itérations.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Quand <code>g &gt; d</code> (les deux indices se sont croisés)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : à chaque échec, l'intervalle<br/>
rétrécit. Quand il devient vide (<code>g &gt; d</code>), on<br/>
sort et on renvoie -1.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Quand on rencontre une exception</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un code correct ne lève pas<br/>
d'exception.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche dichotomique — Q08 : Liste vide</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que renvoie la dichotomie sur une <strong>liste vide</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cas limite à toujours tester. Bonne pratique :<br/>
<code>assert dicho([], 5) == -1</code>.</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><code>None</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Selon notre convention, on renvoie <code>-1</code> (pas<br/>
<code>None</code>).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une exception</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le code correct gère ce cas<br/>
proprement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>-1</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>g = 0</code>, <code>d = -1</code>, donc<br/>
<code>g &gt; d</code> immédiatement. La boucle ne s'exécute<br/>
pas et la fonction renvoie <code>-1</code> directement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>0</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune position 0 dans une liste<br/>
vide.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche dichotomique — Q09 : Pourquoi dichotomique ?</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel est le principal <strong>avantage</strong> de la<br/>
dichotomique sur la linéaire ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Mais attention : si la liste n'est pas triée et<br/>
qu'on la trie juste pour la dichotomie, le tri<br/>
coûte O(n log n). Pour une <strong>seule</strong> recherche,<br/>
la linéaire est plus rapide.</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>Elle est plus simple à programmer</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Au contraire, elle est légèrement plus<br/>
complexe (gestion des indices).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Elle utilise moins de mémoire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Pas un avantage notable : les deux utilisent<br/>
peu de mémoire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Elle ne nécessite pas que la liste soit triée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est la <strong>précondition</strong><br/>
fondamentale.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Elle est exponentiellement plus rapide sur les listes triées de grande taille</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : passer de O(n) à O(log n)<br/>
est un gain énorme. 1 milliard d'éléments :<br/>
1 milliard de comparaisons en linéaire vs<br/>
~ 30 en dichotomique.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche dichotomique — Q10 : Trace simple</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On cherche <code>cible = 17</code> dans<br/>
<code>liste = [3, 7, 11, 17, 25, 31, 42]</code>. Quel est<br/>
l'indice du milieu à la <strong>première étape</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Ici, la dichotomie est miraculeusement efficace<br/>
parce que la cible se trouve juste au milieu.<br/>
Cas favorable : 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>4</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>(0 + 6) // 2 = 3</code>, pas 4.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>6</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 6 est l'indice droit, pas le<br/>
milieu.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>3</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>g = 0</code>, <code>d = 6</code>, milieu =<br/>
<code>(0 + 6) // 2 = 3</code>. La valeur en indice 3 est<br/>
<code>17</code>, qui est la cible : la dichotomie<br/>
réussit en <strong>une seule</strong> comparaison.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>0</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 0 est l'indice gauche, pas le<br/>
milieu.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche dichotomique — Q11 : Invariant de boucle</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel <strong>invariant de boucle</strong> garantit la<br/>
correction de la recherche dichotomique<br/>
itérative (avec les indices <code>g</code> et <code>d</code>) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Invariant + condition d'arrêt → correction.<br/>
À la sortie de la boucle, soit on a trouvé<br/>
la cible, soit <code>g &gt; d</code> (intervalle vide,<br/>
donc la cible n'est pas dans la liste).</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 cible est toujours à l'indice du milieu</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : sinon la dichotomie réussirait<br/>
en une seule comparaison.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La liste est triée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce n'est pas un invariant de la<br/>
boucle, c'est une <strong>précondition</strong> sur<br/>
l'entrée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Si la cible est dans la liste, alors elle se trouve nécessairement dans la tranche <code>liste[g..d]</code> (notation algorithmique inclusive des deux côtés ; en Python : <code>liste[g:d+1]</code>)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est l'invariant clé. À<br/>
l'entrée de chaque itération, la cible<br/>
(si elle existe) est forcément dans la<br/>
tranche encore considérée. Si l'on<br/>
n'élimine que la moitié sans la cible,<br/>
l'invariant reste vrai à la sortie.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>g</code> et <code>d</code> sont toujours égaux</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ils ne deviennent égaux qu'à la<br/>
dernière itération (au plus tard).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche dichotomique — Q12 : Doublons</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Si la cible apparaît <strong>plusieurs fois</strong> dans la<br/>
liste triée, quelle position renvoie la<br/>
dichotomie standard ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour obtenir spécifiquement la <strong>première</strong><br/>
ou la <strong>dernière</strong> occurrence en cas de<br/>
doublons, on adapte légèrement le code de<br/>
la dichotomie (en continuant à chercher à<br/>
gauche ou à droite après une égalité, au<br/>
lieu de s'arrêter).</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>Une occurrence quelconque (la première rencontrée pendant la dichotomie)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la dichotomie standard ne<br/>
précise pas laquelle. Pour avoir la<br/>
<strong>première</strong> ou la <strong>dernière</strong> occurrence,<br/>
il faut une variante (continuer la<br/>
dichotomie même après avoir trouvé).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La dernière occurrence (à droite)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Possible mais non garanti.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Toutes les occurrences</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la dichotomie renvoie un seul<br/>
indice.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La première occurrence (à gauche)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Possible mais non garanti : dépend du<br/>
parcours.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche dichotomique — Q13 : Trace détaillée</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On cherche <code>cible = 25</code> dans<br/>
<code>liste = [3, 7, 11, 17, 25, 31, 42]</code>. Combien de<br/>
comparaisons effectue la dichotomie itérative<br/>
avant de trouver la cible ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour log₂(7) ≈ 2,8, on attend au plus 3<br/>
comparaisons. C'est cohérent.</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</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la cible n'est pas en indice 3.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>7</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est le nombre d'éléments, pas<br/>
de comparaisons.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>2</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : étape 1, milieu = 3 (val<br/>
17 &lt; 25, on va à droite, g=4) ; étape 2,<br/>
milieu = (4+6)//2 = 5 (val 31 &gt; 25, on va à<br/>
gauche, d=4) ; étape 3, milieu = 4 (val 25<br/>
= cible). En réalité 3 comparaisons, mais 2<br/>
décisions de moitié.</p>
<p>Note : si la question demande « comparaisons »<br/>
au sens « tests d'égalité », c'est 3 ; au<br/>
sens « décisions de moitié », c'est 2.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>3</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette réponse compte les <strong>comparaisons<br/>
d'égalité</strong> (3, 17, 25). Selon<br/>
l'interprétation, c'est aussi correct, mais<br/>
le compte par décisions de moitié donne 2.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche dichotomique — Q14 : Élément absent</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On cherche <code>cible = 20</code> dans<br/>
<code>liste = [3, 7, 11, 17, 25, 31, 42]</code>. Que<br/>
renvoie la dichotomie ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour trouver « la valeur la plus proche » ou<br/>
« la position d'insertion », il faut adapter<br/>
légèrement le code de la dichotomie : au<br/>
moment où l'on sortirait avec <code>-1</code>, on<br/>
renvoie plutôt l'indice où la cible aurait<br/>
dû s'insérer.</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 exception</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : code correct gère le cas absent.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>L'indice 4 (position où 20 devrait être inséré)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait le rôle d'une variante<br/>
(« position d'insertion ») qui demande une<br/>
adaptation du code. La dichotomie standard<br/>
renvoie <code>-1</code> quand l'élément est absent.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La valeur 17 (la plus proche)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la dichotomie ne renvoie pas la<br/>
« valeur la plus proche » par défaut.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>-1 (élément absent)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : 20 n'est pas dans la liste.<br/>
La boucle se termine avec <code>g &gt; d</code> et<br/>
renvoie <code>-1</code>.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche dichotomique — Q15 : Bug de bornes</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Un élève écrit <code>while g &lt; d:</code> au lieu de<br/>
<code>while g &lt;= d:</code>. Quel est l'effet ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Toujours tester les <strong>cas limites</strong> : liste à<br/>
un seul élément, cible aux extrémités, cible<br/>
non présente. Ces tests révèlent les bugs de<br/>
bornes.</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 fonction est plus rapide</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : juste incorrecte.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La fonction renvoie toujours -1</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : elle peut renvoyer un indice si la<br/>
cible est trouvée avant le rétrécissement<br/>
final.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La fonction rate la cible quand elle est en position telle que <code>g == d</code> à la fin</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : si l'intervalle se réduit à<br/>
un seul élément (<code>g == d</code>), la condition<br/>
<code>g &lt; d</code> est fausse et on sort sans tester<br/>
ce dernier élément. Bug subtil mais courant.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Boucle infinie</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Pas de boucle infinie, mais un bug logique.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche dichotomique — Q16 : Indice retourné en cas de succès</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Une dichotomie standard sur la liste<br/>
<code>[3, 7, 11, 17, 25, 31, 42]</code> cherche <code>cible = 17</code>.<br/>
Que renvoie-t-elle ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Convention courante : la fonction renvoie<br/>
l'<strong>indice</strong> de la cible quand elle est<br/>
trouvée, et <code>-1</code> (ou parfois <code>None</code>) quand<br/>
elle est absente. La méthode <code>list.index</code><br/>
de Python lève une exception <code>ValueError</code> à<br/>
la place du <code>-1</code>.</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>L'indice <code>3</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la valeur <code>17</code> se trouve<br/>
en position <code>3</code> dans la liste (positions<br/>
<code>0</code> à <code>6</code>). Une dichotomie standard<br/>
renvoie cet indice quand la cible est<br/>
présente.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La longueur de la liste, c'est-à-dire <code>7</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la longueur de la liste n'a aucun<br/>
rapport avec la position de la cible. On<br/>
renvoie <code>-1</code> (par convention) seulement<br/>
si la cible est absente.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La position <code>0</code> (la première de la liste)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la position <code>0</code> correspond à la<br/>
valeur <code>3</code>, pas à <code>17</code>. La dichotomie<br/>
renvoie l'indice exact de la cible<br/>
trouvée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La valeur <code>17</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la fonction renvoie l'<strong>indice</strong><br/>
de la cible, pas sa valeur (qu'on connaît<br/>
déjà puisqu'on la passe en paramètre).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche dichotomique — Q17 : Liste à un élément</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Sur <code>liste = [42]</code> et <code>cible = 42</code>, combien<br/>
d'itérations effectue la dichotomie standard ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cas limite à tester. Si la cible n'était pas 42<br/>
mais autre chose, on aurait besoin de 1 ou 2<br/>
itérations selon les détails du code.</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>1 (une seule itération suffit)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>g = 0</code>, <code>d = 0</code>, donc<br/>
<code>g &lt;= d</code>. Une itération calcule <code>m = 0</code>,<br/>
compare <code>liste[0]</code> et trouve la cible.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>0 (la cible est trouvée sans entrer dans la boucle)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on entre bien dans la boucle pour<br/>
tester la valeur du milieu.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>2</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une itération suffit.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Boucle infinie</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : code correct se termine.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche dichotomique — Q18 : Tri préalable utile ?</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On a une liste <strong>non triée</strong> de 1000 éléments<br/>
sur laquelle on doit faire <strong>une seule</strong><br/>
recherche. Faut-il la trier avant pour faire de<br/>
la dichotomie ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Règle : tri rentable si l'on fait au moins ~ k<br/>
recherches, avec k tel que <code>n log n + k log n<br/>
&lt; k n</code>. Approximativement k &gt; log 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>Oui, parce que dichotomique = mieux</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : « mieux » dépend du contexte. Coût<br/>
de tri à amortir.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Oui, c'est plus rapide</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : trier coûte O(n log n) ≈ 10 000<br/>
opérations, plus 10 pour la dichotomie. La<br/>
recherche linéaire ne fait au plus que<br/>
1 000 comparaisons. Pas rentable.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La dichotomie fonctionne sur une liste non triée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la précondition est essentielle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Non, la recherche linéaire suffit pour une recherche unique</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : trier juste pour une<br/>
recherche est contre-productif. La<br/>
dichotomie devient rentable seulement à<br/>
partir de <strong>plusieurs recherches</strong> sur la<br/>
même liste.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche dichotomique — Q19 : Recherche par approximation</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour trouver la <strong>plus petite valeur ≥ cible</strong><br/>
dans une liste triée, peut-on utiliser une<br/>
dichotomie ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>C'est l'un des grands intérêts de la<br/>
dichotomie : elle s'adapte à toutes sortes de<br/>
requêtes (≤, &lt;, ≥, &gt;) sur des données trié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>Oui, mais cela double la complexité</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la complexité reste O(log n).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Non, la dichotomie ne fonctionne que pour des comparaisons d'égalité</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la dichotomie repose sur des<br/>
<strong>comparaisons d'ordre</strong>, pas d'égalité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Non, cela demande une recherche linéaire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la dichotomie peut être adaptée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Oui, en adaptant légèrement le code de la dichotomie</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : il suffit de continuer à<br/>
chercher dans la moitié gauche après une<br/>
égalité (au lieu de s'arrêter), pour<br/>
retomber sur la plus petite valeur ≥<br/>
cible. La complexité reste <code>O(log n)</code>.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche dichotomique — Q20 : Terminaison</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi la dichotomie itérative <strong>se termine</strong><br/>
toujours (pas de boucle infinie) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Argument de terminaison : on définit un<br/>
« variant » qui décroît strictement (ici,<br/>
<code>d - g</code>). Si le variant est borné inférieurement<br/>
(ici, par 0 ou -1), la boucle se termine.</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>Parce qu'à chaque itération, l'intervalle <code>[g, d]</code> se rétrécit strictement</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>g = m + 1</code> ou <code>d = m - 1</code><br/>
réduit la taille de l'intervalle d'au moins<br/>
un. L'intervalle ne peut donc rétrécir<br/>
indéfiniment, il finit par devenir vide<br/>
(<code>g &gt; d</code>).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que Python limite les boucles à 1000 itérations</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : Python n'impose aucune telle limite.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que la cible est forcément trouvée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la cible peut être absente, et la<br/>
dichotomie se termine quand même.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que la liste est triée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le tri permet la <strong>correction</strong>, pas<br/>
la terminaison.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche dichotomique — Q21 : Boucle infinie</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Un élève écrit <code>g = m</code> (au lieu de <code>g = m + 1</code>)<br/>
après une comparaison <code>liste[m] &lt; cible</code>. Que se<br/>
passe-t-il ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Bug très classique. Test à faire :<br/>
<code>dicho([1, 2], 2)</code> qui doit renvoyer 1. Avec le<br/>
bug, boucle infinie.</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 fonction est plus rapide</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : elle peut boucler indéfiniment.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La fonction lève une exception</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas d'exception, juste une boucle<br/>
infinie.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La fonction renvoie toujours -1</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Pas systématiquement : selon l'entrée, soit<br/>
elle trouve la cible, soit elle boucle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Boucle infinie possible si <code>g + d</code> est pair (donc <code>m == g</code>)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : si <code>g = 0</code>, <code>d = 1</code>, alors<br/>
<code>m = 0</code>. Si on fait <code>g = m</code>, on reste à<br/>
<code>g = 0</code>, et la boucle ne progresse pas.<br/>
D'où l'importance d'écrire <code>g = m + 1</code>.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche dichotomique — Q22 : Trace pas à pas</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On cherche <code>cible = 2</code> dans<br/>
<code>liste = [1, 2, 3, 4, 5, 6, 7, 8]</code> (n=8). Quels<br/>
sont les indices <code>m</code> successivement testés par<br/>
la dichotomie itérative ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Méthode : noter <code>g</code>, <code>d</code>, <code>m</code> à chaque étape,<br/>
mettre à jour les bornes selon la comparaison,<br/>
s'arrêter dès qu'on trouve la cible.</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>3, 1, 2</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la fonction renvoie dès qu'elle<br/>
trouve la cible (à <code>m=1</code>). Elle ne teste pas<br/>
ensuite l'indice 2.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>4 puis 2</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>(0+7)//2 = 3</code>, pas 4. Le calcul<br/>
du milieu utilise la division entière.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>3 puis 1</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : étape 1, <code>g=0,d=7,m=3</code><br/>
(<code>liste[3]=4 &gt; 2</code>, on va à gauche : <code>d=2</code>) ;<br/>
étape 2, <code>g=0,d=2,m=1</code> (<code>liste[1]=2 = cible</code>,<br/>
retour immédiat de l'indice 1). Deux indices<br/>
testés.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>0, 1, 2 (parcours du début)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait une recherche linéaire.<br/>
La dichotomie commence par le milieu.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche dichotomique — Q23 : Variant de boucle</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel est le <strong>variant de boucle</strong> (quantité qui<br/>
décroît strictement) de la dichotomie ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Notion de variant : indispensable pour prouver<br/>
la terminaison d'une boucle. La taille de<br/>
l'intervalle est l'exemple canonique pour la<br/>
dichotomie.</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 valeur du milieu <code>m</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>m</code> peut augmenter ou diminuer selon<br/>
la comparaison.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La cible</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la cible ne change pas pendant la<br/>
recherche.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>L'indice <code>g</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>g</code> peut rester constant si on met<br/>
à jour seulement <code>d</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La taille de l'intervalle de recherche, <code>d - g + 1</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est précisément cette<br/>
quantité qui décroît strictement à chaque<br/>
itération (et même elle est divisée par 2<br/>
en moyenne). Quand elle atteint 0, on sort<br/>
de la boucle.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche dichotomique — Q24 : Recherche en mémoire externe</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On dispose d'un fichier trié de <strong>10 milliards</strong><br/>
d'enregistrements (sur disque). Quel impact<br/>
pratique a la dichotomie ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Idée centrale : à chaque étape, on <strong>divise</strong><br/>
l'intervalle de recherche par deux. C'est ce<br/>
qui donne le coût logarithmique.</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>Cela ne fonctionne pas hors mémoire vive</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la dichotomie ne nécessite pas de<br/>
tout charger en mémoire. C'est même son<br/>
intérêt.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>10 milliards d'accès disque sont nécessaires</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait la linéaire, donc plusieurs<br/>
jours de calcul.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucun, la lecture séquentielle est aussi rapide</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : avec 10 milliards d'enregistrements,<br/>
la lecture séquentielle est très lente.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>~ 34 accès disque suffisent (log₂(10¹⁰) ≈ 33,2)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la dichotomie permet de<br/>
consulter une base gigantesque en très peu<br/>
d'accès. C'est ce qui permet aux moteurs de<br/>
recherche, BDD et autres systèmes<br/>
d'indexer efficacement de gros volumes.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche dichotomique — Q25 : Synthèse</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Parmi les affirmations suivantes sur la<br/>
recherche dichotomique, laquelle est <strong>fausse</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Aucun algorithme universellement supérieur :<br/>
la dichotomie est très puissante mais a ses<br/>
conditions d'application (tri, taille<br/>
suffisante).</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>Sa complexité est O(log n)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : c'est sa caractéristique fondamentale.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Elle ne fonctionne que sur des listes triées</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : c'est la précondition essentielle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Des variantes adaptées du code permettent de localiser la première ou la dernière occurrence en cas de doublons</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : il suffit, après une égalité, de<br/>
continuer à chercher à gauche (pour la<br/>
première occurrence) ou à droite (pour<br/>
la dernière) au lieu de s'arrêter. La<br/>
complexité reste <code>O(log n)</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Elle est toujours plus rapide que la recherche linéaire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Faux (donc bonne réponse) : pour une <strong>seule</strong><br/>
recherche dans une liste <strong>non triée</strong>,<br/>
trier puis dichotomiser coûte plus cher que<br/>
la linéaire. Et sur des très petites listes<br/>
(&lt; 10 éléments), la différence est<br/>
négligeable.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche dichotomique — Q26 : Version récursive</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel code implémente correctement une <strong>version<br/>
récursive</strong> de la recherche dichotomique<br/>
(renvoie l'indice ou <code>-1</code>) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Avantage de la version récursive : code plus<br/>
court, qui suit naturellement le raisonnement<br/>
« diviser pour régner ». Inconvénient : risque<br/>
de dépassement de pile pour de très grandes<br/>
listes (Python limite la profondeur à environ<br/>
1000), ce qui n'est jamais un souci ici car la<br/>
profondeur reste en log₂(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[<pre><code>def dicho(liste, cible, g, d):
    if g &gt;= d:
        return -1
    m = (g + d) // 2
    if liste[m] == cible:
        return m
    return dicho(liste, cible, g, d)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur double : le cas de base <code>g &gt;= d</code> rate<br/>
la cible quand l'intervalle se réduit à un<br/>
seul élément (cas similaire au bug <code>while g &lt; d:</code>),<br/>
et l'appel récursif sans mise à jour de<br/>
<code>g, d</code> provoque une récursion infinie si la<br/>
cible n'est pas en milieu.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>def dicho(liste, cible, g, d):
    if g &gt; d:
        return -1
    m = (g + d) // 2
    if liste[m] == cible:
        return m
    elif liste[m] &lt; cible:
        return dicho(liste, cible, m + 1, d)
    else:
        return dicho(liste, cible, g, m - 1)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : cas de base <code>g &gt; d</code> (intervalle<br/>
vide), sinon trois cas selon la comparaison<br/>
au milieu. La récursion porte sur des bornes<br/>
mises à jour, exactement comme dans la version<br/>
itérative.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def dicho(liste, cible, g, d):
    m = (g + d) // 2
    if liste[m] == cible:
        return m
    elif liste[m] &lt; cible:
        return dicho(liste, cible, m + 1, d)
    else:
        return dicho(liste, cible, g, m - 1)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il manque le cas de base. Quand la<br/>
cible est absente, l'intervalle se rétrécit<br/>
jusqu'à devenir vide (<code>g &gt; d</code>), puis on<br/>
accède à <code>liste[m]</code> avec un indice invalide,<br/>
ce qui peut lever une exception ou faire une<br/>
récursion infinie.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def dicho(liste, cible):
    if len(liste) == 0:
        return -1
    m = len(liste) // 2
    if liste[m] == cible:
        return m
    elif liste[m] &lt; cible:
        return dicho(liste[m+1:], cible)
    else:
        return dicho(liste[:m], cible)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le découpage par tranche<br/>
<code>liste[m+1:]</code> recopie une partie de la liste<br/>
(coût O(n) à chaque appel), ce qui ruine<br/>
l'avantage de la dichotomie. De plus, l'indice<br/>
renvoyé est relatif à la sous-liste, donc<br/>
incorrect par rapport à la liste originale.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche dichotomique — Q27 : Doublement de la taille</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Une recherche dichotomique sur une liste de<br/>
taille <code>n</code> effectue au pire <code>k</code> comparaisons.<br/>
Combien de comparaisons effectue-t-elle au pire<br/>
sur une liste de taille <code>2n</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Lecture pratique : on peut multiplier par mille<br/>
la taille d'une liste sans payer plus de dix<br/>
comparaisons supplémentaires (<code>log₂(1000) ≈ 10</code>).<br/>
C'est ce qui rend la dichotomie incontournable<br/>
pour les très gros volumes.</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><code>2k</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la dichotomie n'est pas linéaire en<br/>
n. Doubler la taille n'ajoute pas k<br/>
comparaisons mais une seule.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>k</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait dire que la complexité ne<br/>
dépend pas de la taille, ce qui est faux. La<br/>
dichotomie ajoute bien une comparaison<br/>
quand on double n.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>k + 1</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la complexité est en<br/>
<code>log₂(n)</code>. Or <code>log₂(2n) = log₂(n) + 1</code>. Donc<br/>
doubler la taille n'ajoute qu'<strong>une seule</strong><br/>
comparaison au pire. C'est la signature<br/>
fondamentale d'un algorithme logarithmique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>k²</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il n'y a pas de carré dans<br/>
<code>log(2n)</code>. Cela donnerait une complexité<br/>
beaucoup trop élevée.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche dichotomique — Q28 : Dichotomie de frontière</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On dispose d'une liste triée de booléens (par<br/>
exemple <code>[False, False, False, True, True, True]</code>)<br/>
et on cherche l'indice de la <strong>première</strong><br/>
occurrence de <code>True</code>. Quel principe permet de<br/>
résoudre ce problème en <code>O(log n)</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Schéma général : si <code>P(i)</code> est une propriété<br/>
monotone sur <code>i</code> (par exemple : « la valeur en<br/>
position <code>i</code> est <code>True</code> »), on trouve la<br/>
frontière en <code>O(log n)</code> par dichotomie. Très<br/>
utile pour des problèmes comme « plus petite<br/>
capacité satisfaisant un critère », « plus<br/>
grande valeur respectant une contrainte », 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>Compter les <code>True</code> puis renvoyer leur position</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : compter les <code>True</code> (ou les <code>False</code>)<br/>
demande de parcourir toute la liste, donc<br/>
<code>O(n)</code>. On perd l'avantage logarithmique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une recherche linéaire suffit, on ne peut pas faire mieux</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on peut faire mieux. La liste est<br/>
triée (tous les <code>False</code> avant tous les<br/>
<code>True</code>), ce qui permet la dichotomie.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Trier la liste de booléens à nouveau</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la liste est déjà triée par<br/>
hypothèse. Trier une liste déjà triée ne<br/>
change rien, et coûte <code>O(n log n)</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une dichotomie adaptée : on regarde le<br/>
milieu, si c'est <code>True</code> la frontière est à<br/>
gauche ou ici, sinon elle est strictement à<br/>
droite ; on rétrécit l'intervalle jusqu'à<br/>
isoler la frontière</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la dichotomie ne se limite<br/>
pas à la recherche d'égalité. Dès qu'une<br/>
propriété est <strong>monotone</strong> (vraie partout<br/>
au-dessus d'un seuil, fausse en-dessous),<br/>
on peut chercher le seuil par dichotomie<br/>
en <code>O(log n)</code>, en adaptant légèrement le<br/>
code (test sur la propriété au lieu d'une<br/>
égalité, et choix de la moitié à<br/>
conserver selon la réponse).</p>]]></text>
    </feedback>
  </answer>
</question>

</quiz>
