<?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 log₂(n).</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 g (gauche) et d (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/>
m = g + (d - g) // 2. C'est plus robuste sur<br/>
certains langages où g + d peut déborder, mais<br/>
en Python (entiers de précision arbitraire),<br/>
(g + d) // 2 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>m = (g + d) // 2</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : moyenne entière des deux<br/>
indices. Le // (division entière) garantit<br/>
un indice valide.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>m = g - d</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>m = g + d</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>m = (g + d) / 2</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : / 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 g = m + 1 (et<br/>
non g = m, 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[<p>`<code>python<br/>
def dicho(liste, cible):<br/>
    g, d = 0, len(liste)<br/>
    while g &lt; d:<br/>
        m = (g + d) // 2<br/>
        if liste[m] == cible:<br/>
            return m<br/>
        g = m<br/>
        d = m<br/>
    return -1<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : g = m et d = m ne réduisent pas<br/>
l'intervalle. Boucle infinie possible.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
def dicho(liste, cible):<br/>
    for x in liste:<br/>
        if x == cible:<br/>
            return x<br/>
    return -1<br/>
</code>`</p>]]></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[<p>`<code>python<br/>
def dicho(liste, cible):<br/>
    g, d = 0, len(liste) - 1<br/>
    while g &lt;= d:<br/>
        m = (g + d) // 2<br/>
        if liste[m] == cible:<br/>
            return m<br/>
        elif liste[m] &lt; cible:<br/>
            g = m + 1<br/>
        else:<br/>
            d = m - 1<br/>
    return -1<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : structure classique avec deux<br/>
indices, mise à jour m + 1 ou m - 1 pour<br/>
éviter les boucles infinies, retour -1 si<br/>
la cible est absente.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>`<code>python<br/>
def dicho(liste, cible):<br/>
    return liste.index(cible)<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : list.index 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 while g &lt;= d:, 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/>
(g &lt;= d), 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 g == d</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : g == d satisfait encore g &lt;= d,<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 g &gt; d (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 (g &gt; d), 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/>
assert dicho([], 5) == -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>None</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Selon notre convention, on renvoie -1 (pas<br/>
None).</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>-1</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : g = 0, d = -1, donc<br/>
g &gt; d immédiatement. La boucle ne s'exécute<br/>
pas et la fonction renvoie -1 directement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>0</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 cible = 17 dans<br/>
liste = [3, 7, 11, 17, 25, 31, 42]. 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 : (0 + 6) // 2 = 3, 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 : g = 0, d = 6, milieu =<br/>
(0 + 6) // 2 = 3. La valeur en indice 3 est<br/>
17, 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 g et d) ?</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 g &gt; d (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 liste[g..d] (notation algorithmique inclusive des deux côtés ; en Python : liste[g:d+1])</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>g et d 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 cible = 25 dans<br/>
liste = [3, 7, 11, 17, 25, 31, 42]. 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 cible = 20 dans<br/>
liste = [3, 7, 11, 17, 25, 31, 42]. 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 -1, 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 -1 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 g &gt; d et<br/>
renvoie -1.</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 while g &lt; d: au lieu de<br/>
while g &lt;= d:. 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 g == d à la fin</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : si l'intervalle se réduit à<br/>
un seul élément (g == d), la condition<br/>
g &lt; d 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/>
[3, 7, 11, 17, 25, 31, 42] cherche cible = 17.<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 -1 (ou parfois None) quand<br/>
elle est absente. La méthode list.index<br/>
de Python lève une exception ValueError à<br/>
la place du -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="100" format="html">
    <text><![CDATA[<p>L'indice 3</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la valeur 17 se trouve<br/>
en position 3 dans la liste (positions<br/>
0 à 6). 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 7</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 -1 (par convention) seulement<br/>
si la cible est absente.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La position 0 (la première de la liste)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la position 0 correspond à la<br/>
valeur 3, pas à 17. 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 17</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 liste = [42] et cible = 42, 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 : g = 0, d = 0, donc<br/>
g &lt;= d. Une itération calcule m = 0,<br/>
compare liste[0] 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 n log n + k log n<br/>
&lt; k n. 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 O(log n).</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/>
d - g). 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 [g, d] se rétrécit strictement</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : g = m + 1 ou d = m - 1<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/>
(g &gt; d).</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 g = m (au lieu de g = m + 1)<br/>
après une comparaison liste[m] &lt; cible. Que se<br/>
passe-t-il ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Bug très classique. Test à faire :<br/>
dicho([1, 2], 2) 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 g + d est pair (donc m == g)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : si g = 0, d = 1, alors<br/>
m = 0. Si on fait g = m, on reste à<br/>
g = 0, et la boucle ne progresse pas.<br/>
D'où l'importance d'écrire g = m + 1.</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 cible = 2 dans<br/>
liste = [1, 2, 3, 4, 5, 6, 7, 8] (n=8). Quels<br/>
sont les indices m successivement testés par<br/>
la dichotomie itérative ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Méthode : noter g, d, m à 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 (à m=1). 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 : (0+7)//2 = 3, 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, g=0,d=7,m=3<br/>
(liste[3]=4 &gt; 2, on va à gauche : d=2) ;<br/>
étape 2, g=0,d=2,m=1 (liste[1]=2 = cible,<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 m</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : m 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 g</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : g peut rester constant si on met<br/>
à jour seulement d.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La taille de l'intervalle de recherche, d - g + 1</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 O(log n).</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 -1) ?</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[<p>`<code>python<br/>
def dicho(liste, cible, g, d):<br/>
    if g &gt;= d:<br/>
        return -1<br/>
    m = (g + d) // 2<br/>
    if liste[m] == cible:<br/>
        return m<br/>
    return dicho(liste, cible, g, d)<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur double : le cas de base g &gt;= d rate<br/>
la cible quand l'intervalle se réduit à un<br/>
seul élément (cas similaire au bug while g &lt; d:),<br/>
et l'appel récursif sans mise à jour de<br/>
g, d 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[<p>`<code>python<br/>
def dicho(liste, cible, g, d):<br/>
    if g &gt; d:<br/>
        return -1<br/>
    m = (g + d) // 2<br/>
    if liste[m] == cible:<br/>
        return m<br/>
    elif liste[m] &lt; cible:<br/>
        return dicho(liste, cible, m + 1, d)<br/>
    else:<br/>
        return dicho(liste, cible, g, m - 1)<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : cas de base g &gt; d (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[<p>`<code>python<br/>
def dicho(liste, cible, g, d):<br/>
    m = (g + d) // 2<br/>
    if liste[m] == cible:<br/>
        return m<br/>
    elif liste[m] &lt; cible:<br/>
        return dicho(liste, cible, m + 1, d)<br/>
    else:<br/>
        return dicho(liste, cible, g, m - 1)<br/>
</code>`</p>]]></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 (g &gt; d), puis on<br/>
accède à liste[m] 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[<p>`<code>python<br/>
def dicho(liste, cible):<br/>
    if len(liste) == 0:<br/>
        return -1<br/>
    m = len(liste) // 2<br/>
    if liste[m] == cible:<br/>
        return m<br/>
    elif liste[m] &lt; cible:<br/>
        return dicho(liste[m+1:], cible)<br/>
    else:<br/>
        return dicho(liste[:m], cible)<br/>
</code>`</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le découpage par tranche<br/>
liste[m+1:] 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 n effectue au pire k comparaisons.<br/>
Combien de comparaisons effectue-t-elle au pire<br/>
sur une liste de taille 2n ?</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 (log₂(1000) ≈ 10).<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>2k</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>k</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>k + 1</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la complexité est en<br/>
log₂(n). Or log₂(2n) = log₂(n) + 1. 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>k²</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il n'y a pas de carré dans<br/>
log(2n). 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 [False, False, False, True, True, True])<br/>
et on cherche l'indice de la <strong>première</strong><br/>
occurrence de True. Quel principe permet de<br/>
résoudre ce problème en O(log n) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Schéma général : si P(i) est une propriété<br/>
monotone sur i (par exemple : « la valeur en<br/>
position i est True »), on trouve la<br/>
frontière en O(log n) 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 True puis renvoyer leur position</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : compter les True (ou les False)<br/>
demande de parcourir toute la liste, donc<br/>
O(n). 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 False avant tous les<br/>
True), 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 O(n log n).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une dichotomie adaptée : on regarde le<br/>
milieu, si c'est True 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 O(log n), 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>
