<?xml version="1.0" encoding="UTF-8"?>
<quiz>
<question type="category">
  <category>
    <text>$course$/QCM de NSI/Première/Recherche linéaire</text>
  </category>
  <info format="html">
    <text><![CDATA[<p>Recherche séquentielle d'un élément dans une liste,<br/>
parcours élément par élément, cas favorables et<br/>
défavorables, complexité, comparaison avec la recherche<br/>
dichotomique, variantes (indice, booléen, toutes les<br/>
occurrences).</p>]]></text>
  </info>
</question>

<question type="multichoice">
  <name>
    <text>Recherche linéaire — Q01 : Recherche linéaire ou séquentielle</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>En quoi consiste la <strong>recherche linéaire</strong> (ou séquentielle) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La recherche linéaire est universelle : elle<br/>
fonctionne sur une liste, une chaîne ou un<br/>
p-uplet, sans hypothèse sur l'ordre des<br/>
éléments. Sa simplicité a un prix : elle peut<br/>
nécessiter jusqu'à n comparaisons.</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>Sauter directement à la position centrale puis comparer</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est l'idée de la recherche<br/>
<strong>dichotomique</strong>, qui n'est applicable qu'à<br/>
une liste triée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Parcourir la liste et comparer chaque élément à la cible</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est l'algorithme le plus<br/>
simple. Il fonctionne sur n'importe quelle<br/>
liste (triée ou non).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Utiliser un dictionnaire pour aller directement à la valeur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : l'accès direct par clé d'un<br/>
dictionnaire est une autre stratégie,<br/>
différente de la recherche linéaire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Trier la liste puis chercher le premier élément</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la recherche linéaire ne nécessite<br/>
pas de tri préalable.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche linéaire — Q02 : Liste triée ou non ?</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>La recherche linéaire suppose-t-elle que la liste<br/>
soit <strong>triée</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Quand la liste est triée, on peut faire mieux<br/>
avec la dichotomique (O(log n)). Mais la linéaire<br/>
reste un choix correct, simple et universel.</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>Uniquement si la liste contient des nombres</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la recherche linéaire fonctionne<br/>
quel que soit le type des éléments<br/>
(nombres, chaînes, objets...).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Non, elle fonctionne sur n'importe quelle liste</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est précisément l'avantage<br/>
de la recherche linéaire. On peut l'appliquer<br/>
à des données non triées (par exemple, une<br/>
liste de noms saisis dans l'ordre d'arrivée).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Uniquement si la liste contient au moins 10 éléments</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la recherche linéaire fonctionne<br/>
aussi sur des listes courtes ou vides.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Oui, sinon elle ne fonctionne pas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est la <strong>dichotomique</strong> qui exige<br/>
une liste triée. La linéaire fonctionne sans<br/>
condition.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche linéaire — Q03 : Pire cas</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel est le <strong>nombre maximal de comparaisons</strong> dans<br/>
une recherche linéaire dans une liste de longueur n ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pire cas : l'élément n'est pas présent. On a fait<br/>
n comparaisons négatives. Meilleur cas : l'élément<br/>
est en première position, une seule comparaison.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>n²</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on parcourt la liste <strong>une seule fois</strong>, sans imbrication de boucle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>log(n)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est la complexité de la recherche<br/>
dichotomique, applicable seulement aux listes<br/>
triées.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>n</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : dans le pire cas (élément<br/>
absent ou en dernière position), il faut<br/>
comparer chacun des n éléments. La complexité<br/>
est en O(n).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>n / 2</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : n / 2 est le nombre <strong>moyen</strong> de<br/>
comparaisons (en supposant l'élément présent<br/>
en position aléatoire), pas le maximum.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche linéaire — Q04 : Quand arrête-t-on la boucle ?</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Dans une recherche linéaire bien programmée, quand<br/>
arrête-t-on de parcourir la liste ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Schéma Python typique :<br/>
<code>for i in range(len(liste)):</code><br/>
<code>    if liste[i] == cible: return i</code><br/>
<code>return -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>Au bout de log(n) comparaisons</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est la dichotomique. Sans<br/>
hypothèse de tri, on ne peut pas s'arrêter<br/>
avant.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Dès que le tout premier élément testé n'est pas le bon</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : si le premier élément n'est pas le<br/>
bon, l'élément peut quand même être plus loin.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Toujours après avoir parcouru toute la liste</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Pas optimal : si on a déjà trouvé l'élément,<br/>
inutile de continuer. Mais cela donne malgré<br/>
tout un résultat correct (juste plus lent).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Dès que la cible est trouvée, ou à la fin de la liste</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on s'arrête au plus tôt, par<br/>
exemple avec un <code>return</code> dès que la cible est<br/>
trouvée. Cela améliore le temps moyen mais ne<br/>
change pas le pire cas (élément absent,<br/>
parcours complet).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche linéaire — Q05 : Que renvoyer si absent ?</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Si l'élément cherché n'est <strong>pas dans la liste</strong>,<br/>
que peut-on raisonnablement renvoyer ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Quelle que soit la convention choisie, la<br/>
spécification de la fonction doit l'indiquer,<br/>
et le programme qui l'appelle doit tester ce<br/>
cas avant d'utiliser le résultat comme une<br/>
position.</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 dernière position de la liste (n - 1)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on confondrait avec « élément en<br/>
dernière position ».</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La position 0 (par défaut)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on confondrait avec « élément en<br/>
première position ».</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La longueur de la liste</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : valeur arbitraire, pas une<br/>
convention reconnue.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>None</code> ou <code>-1</code>, pour signaler l'absence</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : ce sont les deux conventions<br/>
courantes. Au programmeur de choisir, mais<br/>
il faut <strong>être cohérent</strong> dans tout le code.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche linéaire — Q06 : Code Python typique</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel code implémente correctement la recherche<br/>
linéaire et renvoie l'<strong>indice</strong> de la cible (ou<br/>
-1 si absente) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Vérifier deux choses dans toute fonction de<br/>
recherche : le <strong>type</strong> de retour (indice,<br/>
booléen, ou objet), et le <strong>comportement</strong> en<br/>
cas d'absence.</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 chercher(liste, cible):
    for i in range(len(liste)):
        if liste[i] == cible:
            return i
        return -1</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur d'<strong>indentation</strong> : <code>return -1</code> est<br/>
dans la boucle, ce qui termine après la<br/>
première comparaison. La fonction renverrait<br/>
toujours 0 ou -1 selon le premier élément.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def chercher(liste, cible):
    for x in liste:
        if x == cible:
            return x
    return -1</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on renvoie <code>x</code> (la <strong>valeur</strong>), pas<br/>
son indice. La spécification demandait<br/>
l'indice.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>def chercher(liste, cible):
    for i in range(len(liste)):
        if liste[i] == cible:
            return i
    return -1</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : parcours par indice, retour<br/>
précoce dès la cible trouvée, -1 si la<br/>
boucle se termine sans trouver.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def chercher(liste, cible):
    i = 0
    while i &lt; len(liste):
        if liste[i] == cible:
            return i
    return -1</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>i</code> n'est jamais incrémenté. Si la<br/>
cible n'est pas en première position, la<br/>
condition <code>i &lt; len(liste)</code> reste vraie et le<br/>
test <code>liste[0] == cible</code> se répète sans fin :<br/>
boucle infinie. Il manque <code>i = i + 1</code> dans<br/>
la boucle.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche linéaire — Q07 : Opérateur `in`</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>L'expression Python <code>42 in liste</code> réalise<br/>
implicitement quelle opération ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'opérateur <code>in</code> cache une boucle : son coût<br/>
est linéaire. Placer un test <code>in</code> dans une<br/>
boucle revient donc à imbriquer deux<br/>
parcours.</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>Un tri complet de la liste avant de répondre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>in</code> ne modifie pas la liste et ne<br/>
la trie pas.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une recherche dichotomique, rapide</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : Python ne suppose pas que la liste<br/>
est triée. Il fait du linéaire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une recherche linéaire, élément par élément</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : le parcours s'arrête à la<br/>
première correspondance. Sur une liste de<br/>
n éléments, <code>in</code> peut donc effectuer<br/>
jusqu'à n comparaisons.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une vérification du type des éléments</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>in</code> teste l'appartenance, pas le<br/>
type.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche linéaire — Q08 : Liste vide</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que doit renvoyer une recherche linéaire (qui<br/>
renvoie l'indice ou -1) sur une <strong>liste vide</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cas limite à toujours tester. Bonne pratique :<br/>
écrire un test unitaire <code>assert chercher([], x) == -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>Le déclenchement immédiat d'une exception</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Pas nécessairement. Avec le schéma<br/>
standard, la boucle ne s'exécute pas et la<br/>
fonction renvoie <code>-1</code> proprement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>None</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Possible (autre convention), mais selon<br/>
notre énoncé, la fonction renvoie <code>-1</code>.</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 : aucune valeur n'est dans la<br/>
liste vide, donc tout élément y est absent.<br/>
La boucle ne s'exécute pas, on tombe<br/>
directement sur <code>return -1</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>0</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 0 signifierait « trouvé en première<br/>
position » alors qu'il n'y a aucune position.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche linéaire — Q09 : Recherche de minimum</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Trouver le <strong>minimum</strong> d'une liste est aussi un<br/>
cas de recherche linéaire. Quelle est sa<br/>
complexité ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Note importante : ici on <strong>ne peut pas s'arrêter tôt</strong> car on ne sait pas si un élément plus<br/>
petit existe plus loin. C'est différent de la<br/>
recherche d'une valeur précise.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(n²) : double boucle nécessaire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : un seul parcours suffit (en gardant<br/>
le minimum courant dans une variable).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(1) : on prend juste le premier élément</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le premier élément n'est pas<br/>
forcément le minimum (sauf liste triée).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(log n) : recherche dichotomique</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ne fonctionne pas, même sur liste<br/>
triée la dichotomique cherche une cible<br/>
précise, pas un extremum.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>O(n) : on doit comparer tous les éléments</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : pour garantir le minimum, il<br/>
faut <strong>examiner chaque</strong> élément. On ne peut<br/>
pas s'arrêter avant la fin (contrairement à<br/>
la recherche d'une cible précise).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche linéaire — Q10 : Trace simple</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On cherche <code>cible = 7</code> dans <code>liste = [3, 5, 7, 2, 7]</code>.<br/>
Combien de comparaisons effectue une recherche<br/>
linéaire <strong>avec arrêt précoce</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Sans arrêt précoce, on aurait fait 5<br/>
comparaisons et compté 2 occurrence(s). Avec<br/>
arrêt précoce, 3 comparaisons et indice retourné<br/>
directement (= 2).</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>5</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on ne parcourt pas toute la liste si<br/>
on s'arrête au premier <code>7</code> rencontré.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>1</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il faut comparer 3, 5 avant<br/>
d'arriver à 7.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>2</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il faut bien tester <code>liste[2]</code> (et<br/>
la trouver égale à 7) pour conclure.</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>liste[0]=3</code> (≠), <code>liste[1]=5</code> (≠), <code>liste[2]=7</code> (=) → on s'arrête. 3<br/>
comparaisons.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche linéaire — Q11 : Meilleur cas</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la complexité dans le <strong>meilleur cas</strong><br/>
de la recherche linéaire ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour une recherche d'un élément aléatoirement<br/>
placé dans la liste, la complexité <strong>moyenne</strong><br/>
est O(n / 2), souvent simplifiée en O(n) car les<br/>
constantes sont ignorées dans la notation O.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>O(1)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : si l'élément cherché est en<br/>
<strong>première position</strong>, on s'arrête après une<br/>
seule comparaison.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(n²)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : pas de double boucle.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(log n)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun mécanisme dichotomique ici.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>O(n)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : O(n) est le pire cas.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche linéaire — Q12 : Variante booléenne</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On veut juste savoir si l'élément est présent ou<br/>
non (sans avoir besoin de l'indice). Quelle<br/>
fonction renvoie <code>True</code> si la cible est dans la<br/>
liste et <code>False</code> sinon, pour toute liste ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'opérateur <code>in</code> réalise une recherche<br/>
linéaire avec arrêt au premier succès. Dans<br/>
une boucle écrite à la main, <code>return False</code><br/>
ne doit venir qu'après le parcours complet.</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 present(liste, cible):
    return liste[cible]</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>liste[cible]</code> lit l'élément<br/>
d'indice <code>cible</code> ; on obtient une valeur de<br/>
la liste, ou une erreur si <code>cible</code> n'est<br/>
pas un indice valide, mais jamais le<br/>
booléen voulu.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>def present(liste, cible):
    return cible in liste</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : l'opérateur <code>in</code> renvoie<br/>
directement un booléen. Il réalise la même<br/>
recherche linéaire qu'une boucle écrite à<br/>
la main.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def present(liste, cible):
    for x in liste:
        if x == cible:
            return True
        else:
            return False</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le <code>else</code> fait sortir la fonction<br/>
dès le premier élément différent de la<br/>
cible ; <code>present([4, 7], 7)</code> renvoie<br/>
<code>False</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def present(liste, cible):
    return cible == liste</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on compare l'élément à la liste<br/>
entière, ce qui renvoie toujours <code>False</code><br/>
(sauf cas dégénéré).</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche linéaire — Q13 : Toutes les occurrences</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour trouver <strong>toutes</strong> les positions où la cible<br/>
apparaît dans la liste, quelle adaptation de la<br/>
recherche linéaire utilise-t-on ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Code typique :<br/>
<code>[i for i in range(len(liste)) if liste[i] == cible]</code>.<br/>
Élégant, en une ligne, en O(n).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>On trie d'abord entièrement la liste avant de chercher</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : trier modifie l'ordre et fait perdre<br/>
les positions originales.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>On parcourt toute la liste en enregistrant tous les indices correspondants</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : pas d'arrêt précoce ici, on<br/>
accumule dans une liste de résultats.<br/>
Complexité : O(n) (parcours unique).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>On utilise une recherche dichotomique</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la dichotomique trouve <strong>une</strong><br/>
occurrence dans une liste triée, mais ne<br/>
liste pas toutes les occurrences naturellement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>On s'arrête à la première occurrence et on l'enregistre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on raterait les suivantes.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche linéaire — Q14 : Linéaire vs dichotomique</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour rechercher un élément dans une <strong>liste triée</strong><br/>
de 1 000 000 d'éléments, combien de comparaisons<br/>
au pire avec chacune des deux méthodes ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>log₂(2¹⁰) = 10, log₂(2²⁰) = 20. Doubler la<br/>
taille de la liste ajoute juste <strong>une</strong><br/>
comparaison à la dichotomique, mais double les<br/>
comparaisons de la linéaire.</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>Linéaire : 1 000 000 ; dichotomique : environ 20</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : log₂(10⁶) ≈ 20. La<br/>
dichotomique est environ 50 000 fois plus rapide<br/>
dans ce cas. C'est l'intérêt majeur du tri.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Linéaire : 1 000 000 ; dichotomique : 1 000</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la dichotomique est en O(log n),<br/>
beaucoup plus efficace.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Linéaire : 1 000 ; dichotomique : 1 000 000</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : valeurs inversées.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les deux sont identiques</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la dichotomique est exponentiellement<br/>
plus rapide sur les grandes tailles.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche linéaire — Q15 : Bug d'initialisation</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Un élève écrit<br/>
<pre><code>def chercher(liste, cible):
    for i in range(len(liste)):
        if liste[i] == cible:
            trouve = True
        else:
            trouve = False
    return trouve</code></pre><br/>
Quel est le bug ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Schéma correct : initialiser un drapeau<br/>
<strong>avant</strong> la boucle, ne le mettre à <code>True</code><br/>
qu'<strong>en cas de succès</strong>. Mieux : utiliser<br/>
<code>return True</code> direct et <code>return False</code> après la<br/>
boucle.</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>return</code> doit être à l'intérieur de la boucle</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait un autre code, mais ce<br/>
n'est pas la cause du bug actuel.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Seul le résultat de la dernière comparaison est renvoyé</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : à chaque itération, le<br/>
<code>else</code> réinitialise <code>trouve</code>. Si la cible<br/>
est trouvée puis que la dernière itération<br/>
échoue, <code>trouve</code> finit à <code>False</code>.<br/>
Solution : initialiser <code>trouve = False</code><br/>
avant la boucle, et ne faire que<br/>
<code>trouve = True</code> à l'intérieur (sans<br/>
<code>else</code>).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La fonction parcourt la liste deux fois au lieu d'une</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il n'y a qu'un seul parcours ; le<br/>
problème est logique, pas une question de<br/>
performance.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La variable <code>trouve</code> n'est pas définie hors de la boucle</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : Python autorise (à risque) la sortie<br/>
d'une variable de boucle, tant que la<br/>
boucle s'exécute au moins une fois.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche linéaire — Q16 : While ou for ?</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la différence pratique entre une<br/>
recherche linéaire écrite avec <code>for</code> et avec<br/>
<code>while</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Bonne pratique : <code>for</code> pour parcourir une<br/>
structure connue ; <code>while</code> quand on ne sait pas<br/>
à l'avance combien d'itérations seront<br/>
nécessaires (lecture utilisateur, condition<br/>
complexe).</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 boucle <code>while</code> ne permet pas de parcourir une liste</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>while</code> fonctionne avec n'importe<br/>
quelle condition booléenne, y compris sur<br/>
un indice de liste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p><code>for</code> parcourt les indices, <code>while</code> combine deux conditions d'arrêt</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>while</code> permet une condition<br/>
composée. <code>for</code> est plus concis quand on<br/>
itère simplement sur la longueur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La boucle <code>for</code> s'exécute toujours nettement plus rapidement</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Performance équivalente. La différence est<br/>
stylistique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Les deux sont strictement équivalents en Python</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Sur le plan du résultat oui, sur le plan de<br/>
la lisibilité non.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche linéaire — Q17 : Retrouver un nom à partir d'un numéro</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Le dictionnaire suivant associe à chaque nom un<br/>
numéro de téléphone :</p>
<pre><code>annuaire = {"Ali": "0612", "Awa": "0745", "Tom": "0698"}</code></pre>
<p>Quel moyen permet de retrouver le nom dont le<br/>
numéro est <code>"0745"</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Dans un dictionnaire, on retrouve une valeur<br/>
à partir de sa clé, pas l'inverse. Pour<br/>
chercher une clé d'après sa valeur, on<br/>
parcourt les clés (ou <code>annuaire.items()</code>)<br/>
et on s'arrête à la première valeur égale à<br/>
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>Écrire <code>annuaire["0745"]</code>, qui renvoie directement le nom associé</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : entre crochets, on donne une clé,<br/>
et <code>"0745"</code> n'est pas une clé mais une<br/>
valeur. Cette instruction provoque une<br/>
erreur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Évaluer <code>"0745" in annuaire</code>, qui renvoie le nom associé au numéro</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>in</code> teste la présence parmi les<br/>
<strong>clés</strong> et renvoie un booléen, ici<br/>
<code>False</code>. Il ne renvoie jamais de nom.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Parcourir les clés et comparer à <code>"0745"</code> la valeur associée à chacune</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : l'accès par clé ne<br/>
fonctionne que dans le sens nom vers<br/>
numéro. Dans l'autre sens, on fait une<br/>
recherche linéaire : <code>for nom in annuaire:</code><br/>
puis on teste <code>annuaire[nom] == "0745"</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Faire une recherche dichotomique sur les numéros, rangés dans l'ordre croissant</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : rien ne garantit que les numéros<br/>
soient rangés dans l'ordre, et on ne peut<br/>
pas accéder à la valeur du milieu d'un<br/>
dictionnaire par un indice.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche linéaire — Q18 : Optimisation par fréquence</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Si l'on sait qu'un élément est <strong>plus souvent cherché</strong> que les autres, comment optimiser une<br/>
série de recherches linéaires successives ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le nombre de comparaisons d'une recherche<br/>
linéaire dépend de la position de l'élément<br/>
cherché. C'est un bon exemple où l'<strong>ordre</strong><br/>
des données influence la performance.</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 par ordre croissant</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le tri n'aide pas la recherche linéaire et<br/>
demande lui-même de nombreuses comparaisons.<br/>
De plus, les éléments fréquents ne sont pas<br/>
forcément les plus petits.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Doubler purement et simplement la taille de la liste</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : cela aggrave le problème.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Placer les éléments les plus fréquents en début de liste</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la recherche linéaire avec<br/>
arrêt précoce trouve ces éléments après très<br/>
peu de comparaisons.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Convertir la liste en chaîne</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucun gain, et <code>in</code> sur une chaîne<br/>
recherche les sous-chaînes, pas les<br/>
éléments.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche linéaire — Q19 : Recherche dans liste de tuples</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Soit<br/>
<code>eleves = [("Alice", 17), ("Bob", 16), ("Eve", 18)]</code>.<br/>
Comment trouver l'âge d'Alice ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Si l'on fait souvent ce genre de recherche,<br/>
mieux vaut construire une fois pour toutes un<br/>
dictionnaire des âges :<br/>
<code>ages = {}</code><br/>
<code>for nom, age in eleves: ages[nom] = age</code><br/>
puis <code>ages["Alice"]</code> répond en O(1).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>eleves["Alice"]</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>eleves</code> est une liste, pas un<br/>
dictionnaire. On ne peut pas l'indexer par<br/>
chaîne.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>for nom, age in eleves:
    if nom == "Alice":
        return age</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on déballe chaque tuple en<br/>
deux variables, on teste le nom, on renvoie<br/>
l'âge. Recherche linéaire classique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>for nom, age in eleves:
    if nom == "Alice":
        return nom</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on renvoie le <strong>nom</strong> (<code>"Alice"</code>,<br/>
déjà connu) au lieu de l'âge. La structure<br/>
est bonne, mais la valeur renvoyée n'est<br/>
pas celle demandée : il faut <code>return age</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>for eleve in eleves:
    if eleve == "Alice":
        return eleve[1]</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>eleve</code> est un <strong>tuple</strong> complet, par<br/>
exemple <code>("Alice", 17)</code>, jamais égal à la<br/>
chaîne <code>"Alice"</code> : la condition est toujours<br/>
fausse et rien n'est renvoyé. Il faut comparer<br/>
<code>eleve[0]</code>, ou déballer le tuple en <code>nom, age</code>.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche linéaire — Q20 : Sur une chaîne</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>L'expression <code>"a" in "abracadabra"</code> :</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Subtilité : sur une chaîne, <code>"abc" in "ababcabc"</code><br/>
renvoie aussi <code>True</code> (sous-chaîne, pas<br/>
caractère). Sur une liste, <code>"abc" in liste</code><br/>
teste l'égalité avec chaque élément.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Lève une exception</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la syntaxe est valide.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Renvoie <code>False</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>"a"</code> apparaît bien dans<br/>
<code>"abracadabra"</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Renvoie le nombre d'occurrences</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>in</code> renvoie un booléen, pas un<br/>
entier. Pour le comptage, utiliser <code>.count()</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Renvoie <code>True</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>in</code> sur une chaîne fait une<br/>
recherche de <strong>sous-chaîne</strong> (pas de<br/>
caractère unique seulement). <code>"a"</code> est<br/>
présent comme sous-chaîne.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche linéaire — Q21 : Bug : oubli de l'arrêt</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p><pre><code>def trouver(liste, cible):
    indice = -1
    for i in range(len(liste)):
        if liste[i] == cible:
            indice = i
    return indice</code></pre><br/>
Quel est le comportement de cette fonction si la<br/>
cible apparaît plusieurs fois ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Cas piège mais utile : ce code peut être correct<br/>
si l'on cherche <strong>la dernière occurrence</strong>. Pour<br/>
la version classique « première occurrence », on<br/>
écrit <code>return i</code> à la place de <code>indice = i</code> : la<br/>
fonction s'arrête dès la première correspondance.</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 renvoie -1</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : -1 est l'initialisation, mais elle<br/>
est écrasée si une correspondance existe.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Elle renvoie l'indice de la dernière occurrence</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la boucle continue jusqu'au<br/>
bout, et <code>indice = i</code> écrase la valeur à<br/>
chaque correspondance. À la fin, c'est la<br/>
dernière occurrence qui reste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Elle entre dans une boucle infinie</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>for</code> sur <code>range</code> est borné.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Elle renvoie l'indice de la première occurrence</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : rien n'arrête la boucle à la<br/>
première correspondance : il faudrait<br/>
écrire <code>return i</code> dès que <code>liste[i] == cible</code>.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche linéaire — Q22 : Choisir le bon algorithme</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour rechercher un élément dans une liste de<br/>
100 éléments, <strong>non triée</strong>, qu'on ne consultera<br/>
qu'une seule fois, quelle stratégie est la plus<br/>
efficace <strong>globalement</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Règle générale : prétraiter (trier, indexer)<br/>
n'est rentable qu'au-delà d'un certain nombre<br/>
de recherches. Pour une recherche unique, la<br/>
linéaire est imbattable en simplicité.</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>Recherche linéaire directement</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : pour <strong>une seule</strong><br/>
recherche, la linéaire (au plus 100<br/>
comparaisons) est plus rapide que tri +<br/>
dichotomie. L'investissement du tri n'est<br/>
rentable que pour de <strong>multiples</strong><br/>
recherches.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Convertir en dictionnaire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : construire le dictionnaire demande<br/>
déjà de parcourir toute la liste. Pour une<br/>
seule recherche, le gain est nul.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Faire la recherche en parallèle sur 4 cœurs</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Sur 100 éléments, le coût de<br/>
parallélisation dépasse largement le coût<br/>
de la recherche.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Trier puis dichotomie</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : trier 100 éléments par sélection<br/>
coûte $100 \times 99 / 2 = 4\,950$<br/>
comparaisons, plus 7 pour la dichotomie,<br/>
contre 100 au plus pour la recherche<br/>
linéaire. Pas rentable pour une seule<br/>
recherche.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche linéaire — Q23 : Boucle while à bug</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p><pre><code>def chercher(liste, cible):
    i = 0
    while liste[i] != cible:
        i += 1
    return i</code></pre><br/>
Quel problème pose ce code ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Bug très classique. Pour les boucles <code>while</code>,<br/>
toujours vérifier deux choses : la condition<br/>
d'arrêt <strong>et</strong> l'évolution de la variable de<br/>
boucle (pour éviter une boucle infinie ou un<br/>
dépassement).</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucun, ce code est correct pour toutes les entrées</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : il y a un bug majeur lié au cas<br/>
d'absence de la cible.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La fonction ne renvoie jamais rien, même si la cible est présente</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : elle renvoie <code>i</code> quand elle trouve<br/>
la cible.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Si l'élément est absent, la boucle dépasse la liste et lève <code>IndexError</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : il manque la condition<br/>
<code>i &lt; len(liste)</code> dans le <code>while</code>. Sans cela,<br/>
on accède à <code>liste[len(liste)]</code> qui n'existe<br/>
pas. Solution :<br/>
<code>while i &lt; len(liste) and liste[i] != cible:</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le code modifie accidentellement le contenu de la liste</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : aucune modification de la liste.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche linéaire — Q24 : Comparer en pratique</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Sur ma machine, une recherche linéaire dans une<br/>
liste de 1 million d'éléments prend environ 30 ms. Que<br/>
prendra une recherche dans une liste de 1 milliard<br/>
d'éléments (si la mémoire le permet) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Compétence essentielle : savoir extrapoler le<br/>
temps d'exécution selon la complexité. La<br/>
recherche linéaire devient gênante au-delà de<br/>
quelques millions d'éléments si elle est<br/>
répétée.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Environ 60 ms</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 1 milliard, c'est mille fois plus<br/>
que 1 million, pas deux fois. Le temps est<br/>
donc multiplié par 1000, pas par 2.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Environ 30 secondes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : O(n) → temps proportionnel.<br/>
1 milliard / 1 million = 1000, donc 30 ms ×<br/>
1000 = 30 secondes. Cette estimation est précieuse<br/>
pour anticiper les performances.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Environ 8 heures</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait l'ordre de grandeur d'une<br/>
complexité <strong>quadratique</strong> (facteur<br/>
1000² = 10⁶, soit 30 ms × 10⁶ ≈ 8 h). La<br/>
recherche linéaire ne croît que d'un<br/>
facteur 1000.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Toujours environ 30 ms</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : ce serait un temps <strong>constant</strong>.<br/>
O(n) signifie que le temps croît<br/>
<strong>proportionnellement</strong> à n.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche linéaire — Q25 : Synthèse</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Parmi les affirmations suivantes sur la recherche<br/>
linéaire, laquelle est <strong>fausse</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Maxime : « Pas d'algorithme universellement<br/>
meilleur. » Le choix dépend des hypothèses<br/>
(liste triée ?), du nombre de recherches, et<br/>
de la taille des donné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>En Python, l'opérateur <code>in</code> sur une liste fait une recherche linéaire</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : <code>in</code> sur une liste est en O(n) ; sur<br/>
les clés d'un dictionnaire, il est en O(1)<br/>
en moyenne.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Elle fonctionne sur des listes triées comme non triées</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : c'est l'avantage majeur sur la<br/>
dichotomique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Sa complexité au pire est O(n)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Vrai : parcours complet de la liste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Elle est toujours plus rapide que la dichotomique</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Faux (donc bonne réponse) : sur une liste<br/>
triée et de grande taille, la dichotomique<br/>
(O(log n)) est exponentiellement plus<br/>
rapide. La linéaire reste compétitive sur<br/>
des petites listes ou pour une recherche<br/>
unique.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche linéaire — Q26 : Compter les occurrences</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On veut <strong>compter</strong> combien de fois la cible<br/>
apparaît dans la liste (et non simplement la<br/>
trouver). Quelle adaptation de la recherche<br/>
linéaire faut-il faire ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Différence essentielle avec la recherche d'une<br/>
occurrence : on ne peut pas s'arrêter au premier<br/>
succès, donc le pire cas et le meilleur cas sont<br/>
identiques, avec n comparaisons.</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 compter(liste, cible):
    for x in liste:
        if x == cible:
            return 1
    return 0</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur classique : on s'arrête à la première<br/>
occurrence et on renvoie toujours 0 ou 1, ce<br/>
qui revient à un test d'appartenance, pas à<br/>
un comptage.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def compter(liste, cible):
    if cible in liste:
        return len(liste)
    else:
        return 0</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur grossière : si la cible apparaît au<br/>
moins une fois, on renvoie la longueur<br/>
totale de la liste (donc tous les éléments<br/>
sont comptés, même ceux qui ne sont pas la<br/>
cible).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>def compter(liste, cible):
    n = 0
    for x in liste:
        if x == cible:
            n += 1
    return n</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : on parcourt <strong>toute</strong> la<br/>
liste sans arrêt précoce et on incrémente un<br/>
compteur à chaque correspondance. Le coût<br/>
est linéaire.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def compter(liste, cible):
    for x in liste:
        n = 0
        if x == cible:
            n += 1
    return n</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>n = 0</code> est placé dans la boucle,<br/>
donc le compteur repart de zéro à chaque<br/>
tour. La fonction renvoie 1 si le dernier<br/>
élément est la cible et 0 sinon, et<br/>
provoque une erreur sur une liste vide.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche linéaire — Q27 : Recherche par condition</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On cherche le <strong>premier</strong> élément d'une liste de<br/>
nombres qui soit <strong>strictement supérieur</strong> à<br/>
<code>100</code> (et son indice). Quel code applique<br/>
correctement la recherche linéaire à ce cas ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Schéma général de la recherche linéaire par<br/>
condition : le test d'égalité <code>liste[i] == cible</code><br/>
est remplacé par n'importe quelle condition sur<br/>
<code>liste[i]</code> ; le reste du parcours (arrêt au<br/>
premier succès, valeur renvoyée en cas<br/>
d'absence) est inchangé.</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 premier_grand(liste):
    triee = sorted(liste)
    return triee[len(triee) - 1]</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur double : on trie une copie de la<br/>
liste, ce qui coûte un tri complet, puis on<br/>
renvoie le maximum, qui n'est pas forcément<br/>
le <strong>premier</strong> élément supérieur à 100 dans<br/>
l'ordre original. L'indice n'est pas non<br/>
plus renvoyé.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def premier_grand(liste):
    for i in range(len(liste)):
        if liste[i] &gt; 100:
            return True
    return False</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur de spécification : ce code répond à<br/>
la question « existe-t-il un élément<br/>
supérieur à 100 ? » par un booléen, alors<br/>
qu'on demande cet élément et son indice. Le<br/>
parcours est le bon, mais la valeur<br/>
renvoyée ne l'est pas.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def premier_grand(liste):
    for x in liste:
        if x &gt; 100:
            return x
        return None</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur d'indentation : <code>return None</code> est<br/>
dans la boucle, donc la fonction sort dès le<br/>
premier élément (qui est rarement supérieur<br/>
à 100). De plus, on ne renvoie pas l'indice.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>def premier_grand(liste):
    for i in range(len(liste)):
        if liste[i] &gt; 100:
            return (i, liste[i])
    return None</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la recherche linéaire se<br/>
généralise à n'importe quelle condition. On<br/>
parcourt les indices, on teste la condition<br/>
sur <code>liste[i]</code>, on renvoie le couple (indice,<br/>
valeur) dès le premier succès, et <code>None</code> si<br/>
aucun élément ne convient.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche linéaire — Q28 : Recherche dans un tableau à deux dimensions</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>On dispose d'une matrice carrée représentée par<br/>
une liste de listes (par exemple<br/>
<code>m = [[3, 7, 1], [8, 2, 5], [4, 9, 6]]</code>). On<br/>
cherche le couple <code>(ligne, colonne)</code> de la<br/>
première occurrence de la valeur <code>5</code>. Quel code<br/>
est correct ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Ce code fonctionne aussi pour une matrice non<br/>
carrée, puisque <code>len(m[i])</code> est la longueur de<br/>
la ligne courante. Le <code>return (i, j)</code> sort des<br/>
deux boucles d'un coup : c'est l'intérêt<br/>
d'écrire cette recherche dans une fonction.</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 chercher(m, cible):
    for i in range(len(m)):
        for j in range(len(m[i])):
            if m[i][j] == cible:
                return (i, j)
        return None</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>return None</code> est placé dans la<br/>
boucle sur les lignes, donc la fonction<br/>
abandonne après avoir examiné la première<br/>
ligne. Avec la matrice donnée, <code>5</code> est en<br/>
ligne 1 et l'appel renvoie <code>None</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def chercher(m, cible):
    for ligne in m:
        for x in ligne:
            if x == cible:
                return x
    return None</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on renvoie la <strong>valeur</strong> trouvée<br/>
(ce qui est trivial puisqu'on connaît<br/>
déjà la cible), pas le couple de<br/>
coordonnées demandé. Il faut parcourir<br/>
les indices <code>i</code> et <code>j</code> avec <code>range</code> pour<br/>
pouvoir renvoyer le couple <code>(i, j)</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def chercher(m, cible):
    for i in range(len(m)):
        if m[i] == cible:
            return i
    return None</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : on compare une <strong>ligne entière</strong> à<br/>
la cible (un nombre), ce qui sera toujours<br/>
faux. On confond élément de la matrice et<br/>
ligne.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>def chercher(m, cible):
    for i in range(len(m)):
        for j in range(len(m[i])):
            if m[i][j] == cible:
                return (i, j)
    return None</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : double boucle imbriquée pour<br/>
parcourir lignes et colonnes, retour<br/>
précoce dès la cible trouvée. Pour la<br/>
matrice donnée, on renvoie <code>(1, 2)</code>.<br/>
Complexité O(L × C) où L est le nombre de<br/>
lignes et C le nombre de colonnes.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche linéaire — Q29 : Le nombre de comparaisons pour un élément présent</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Une recherche linéaire parcourt une liste de $10$ éléments depuis<br/>
le début et s'arrête dès qu'elle trouve la valeur cherchée. Cette<br/>
valeur se trouve en position $7$, en comptant à partir de $1$.<br/>
Combien de comparaisons sont effectuées ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le coût d'une recherche linéaire dépend de la position de la<br/>
valeur : au mieux $1$, au pire $n$.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>$7$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : chaque élément examiné coûte une comparaison, du<br/>
premier jusqu'à celui qui est trouvé, soit $7$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$10$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la recherche s'arrête dès que la valeur est trouvée,<br/>
sans examiner la fin de la liste.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$6$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la comparaison qui trouve l'élément compte aussi.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$8$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une fois la valeur trouvée, aucune comparaison<br/>
supplémentaire n'a lieu.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche linéaire — Q30 : Le nombre de comparaisons pour un élément absent</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Une recherche linéaire cherche une valeur absente d'une liste de<br/>
$1\,000$ éléments. Combien de comparaisons effectue-t-elle ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'absence est le pire cas de la recherche linéaire : $n$<br/>
comparaisons pour $n$ éléments.</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\,000$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : pour conclure à l'absence, il faut avoir<br/>
comparé la valeur à chaque élément, sans exception.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$500$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la moitié serait un coût moyen pour une valeur<br/>
présente ; une valeur absente oblige à tout parcourir.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$1$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : une seule comparaison ne permet pas d'affirmer que la<br/>
valeur n'est nulle part.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$2\,000$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : chaque élément n'est comparé qu'une fois.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche linéaire — Q31 : Le coût moyen d'une recherche</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Une liste contient $1\,000$ éléments et la valeur cherchée s'y trouve,<br/>
à une position aussi probable qu'une autre. Combien de comparaisons<br/>
la recherche linéaire effectue-t-elle en moyenne ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Meilleur cas, pire cas et cas moyen décrivent trois situations. Pour<br/>
la recherche linéaire, le cas moyen reste proportionnel à $n$.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Environ $500$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la position va de $1$ à $1\,000$ avec la même<br/>
probabilité ; la moyenne des coûts est à peu près la moitié de<br/>
$1\,000$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$1\,000$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : $1\,000$ est le pire cas, quand la valeur est en dernière<br/>
position ou absente.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>$1$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : $1$ est le meilleur cas, quand la valeur est en tête.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Environ $\log_2 1\,000$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le coût logarithmique est celui de la recherche<br/>
dichotomique, sur une liste triée.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche linéaire — Q32 : Une liste deux fois plus longue</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Sur une liste de un million d'éléments, une recherche linéaire dans le pire<br/>
cas prend $2$ s. Combien de temps prend-elle, toujours dans le<br/>
pire cas, sur une liste de deux millions d'éléments ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Dire qu'un coût est linéaire, c'est dire que le temps suit la<br/>
taille des données : multiplier l'une par deux multiplie l'autre<br/>
par 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="100" format="html">
    <text><![CDATA[<p>Environ $4$ s</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : le coût est proportionnel au nombre d'éléments.<br/>
Deux fois plus d'éléments, deux fois plus de comparaisons, deux<br/>
fois plus de temps.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Toujours $2$ s</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : chaque élément supplémentaire est une comparaison de<br/>
plus ; le temps augmente.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Environ $2 + 1$ s</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le temps ne croît pas d'une constante mais<br/>
proportionnellement à la taille.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Environ $2 \times 2$ s</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le coût n'est pas quadratique ; doubler la taille<br/>
double le temps, il ne le met pas au carré.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche linéaire — Q33 : La dernière position d'une valeur</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'affiche ce programme ?<br/>
<pre><code>def derniere(t, x):
    pos = -1
    for i in range(len(t)):
        if t[i] == x:
            pos = i
    return pos

print(derniere([4, 7, 4, 9, 4, 1], 4))</code></pre></p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une recherche linéaire sans <code>return</code> dans la boucle parcourt toute<br/>
la liste : elle trouve la dernière occurrence au lieu de la<br/>
première.</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>4</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : sans arrêt anticipé, <code>pos</code> est réécrit à chaque<br/>
occurrence et garde l'indice de la dernière, 4.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>0</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 0 est l'indice de la première occurrence ; la<br/>
boucle continue après.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>3</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 3 est le nombre d'occurrences, mais <code>pos</code> mémorise<br/>
un indice.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>-1</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>-1</code> ne reste que si la valeur est absente.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche linéaire — Q34 : La position du maximum</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'affiche ce programme ?<br/>
<pre><code>def position_max(t):
    im = 0
    for i in range(1, len(t)):
        if t[i] &gt; t[im]:
            im = i
    return im

print(position_max([3, 8, 2, 8, 5]))</code></pre></p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Chercher la position du maximum est une recherche linéaire avec<br/>
mémoire : on retient l'indice du meilleur candidat rencontré.</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>1</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>im</code> ne change qu'en cas de valeur strictement<br/>
plus grande ; en cas d'égalité, la première occurrence du<br/>
maximum est conservée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>8</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 8 est la valeur maximale ; la fonction renvoie son<br/>
indice.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>3</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : avec <code>&gt;</code> strict, la dernière occurrence du maximum ne<br/>
remplace pas la première.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>0</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>im</code> part de 0 mais est remplacé dès qu'une valeur plus<br/>
grande apparaît.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche linéaire — Q35 : L'indice renvoyé en cas de répétition</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>La fonction <code>recherche(t, x)</code> renvoie l'indice du premier élément<br/>
égal à <code>x</code>, ou <code>-1</code> s'il n'y en a pas. Que renvoie<br/>
<code>recherche([5, 6, 7, 6], 6)</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>En cas de répétition, la recherche linéaire classique renvoie la<br/>
première occurrence, celle qui arrête le parcours.</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>1</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : la valeur 6 apparaît plusieurs fois, et la<br/>
recherche s'arrête à la première, d'indice 1.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>3</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : 3 est l'indice de la dernière occurrence ; la<br/>
recherche s'arrête à la première.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>6</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la fonction renvoie un indice, pas la valeur cherchée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p><code>-1</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>-1</code> n'est renvoyé que si la valeur est absente.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Recherche linéaire — Q36 : La place du return final</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Dans cette fonction, pourquoi <code>return -1</code> est-il placé après la<br/>
boucle et non à l'intérieur ?<br/>
<pre><code>def recherche(t, x):
    for i in range(len(t)):
        if t[i] == x:
            return i
    return -1</code></pre></p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un <code>return</code> dans la boucle signale le succès ; le <code>return</code> après la<br/>
boucle signale l'échec, une fois tous les éléments examinés.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Pour ne conclure à l'absence qu'après la fin du parcours</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : <code>return -1</code> n'est atteint que si la boucle s'est<br/>
terminée sans trouver <code>x</code>. Placé dans la boucle, il<br/>
interromprait la recherche dès le premier élément différent.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour que la fonction renvoie toujours <code>-1</code> en dernier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : si <code>x</code> est trouvé, <code>return i</code> sort de la fonction avant<br/>
d'atteindre <code>return -1</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce qu'un <code>return</code> est interdit dans une boucle</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : <code>return i</code> est précisément dans la boucle, et c'est<br/>
permis.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour économiser une comparaison à chaque tour de boucle</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la position du <code>return</code> final ne change pas le nombre de<br/>
comparaisons.</p>]]></text>
    </feedback>
  </answer>
</question>

</quiz>
