Principes de programmation

Recherche

2526 · Dekens Antoine

Recherches linéraires

ou recherche séquentielle

Définition

La recherche séquentielle ou recherche linéaire est un algorithme pour trouver une valeur dans une liste. Elle consiste simplement à considérer les éléments de la liste les uns après les autres, jusqu'à ce que l'élément soit trouvé, ou que toutes les cases aient été lues. Elle est aussi appelée recherche par balayage.

Principe

La recherche séquentielle consiste à prendre les éléments de la liste les uns après les autres, jusqu'à avoir trouvé la cible, ou avoir épuisé la liste.

Propriétés

  • Structure des données libre (avec ou sans tri)
  • Efficacité et performance réduite sur un large panel de données

Exemple non trié

Le but est trouver la présence du nombre 128 dans un tableau contenant d'autres nombres :

$data: [ 1024, 8, 32, 256, 128, 512, 64, 16 ];
$toFind: 128;

while

On prévoit une variable $found qui contiendra notre donnée si elle est trouvée dans notre tableau depuis une boucle while :

$data = [ 1024, 8, 32, 256, 128, 512, 64, 16 ];
$toFind = 128;
$found = null;
$length = count( $data );

$i = 0;
while( $i < $length ){
  // Vérifie si notre nombre est strictement égale
  // à la donnée positionnée à $i dans notre tableau.
  if( $toFind === $data[ $i ] ){
    $found = $data[ $i ];
  }

  $i++;
}

echo $found;

Amélioration

Pour le moment, notre boucle traverse toute les données de notre tableau même si nous avons trouvé une concordance. On pourrait ajouter une deuxième condition qui le vérifie et permettra de stopper notre boucle :

$data = [ 1024, 8, 32, 256, 128, 512, 64, 16 ];
$toFind = 128;
$found = null;
$length = count( $data );

$i = 0;
while( ( $i < $length ) AND ( $found === null ) ){
  if( $toFind === $data[ $i ] ){
    $found = $data[ $i ];
  }

  $i++;
}

echo $found;

Break

L'instruction break permet de mettre fin à l'éxécution d'une boucle de manière manuelle. L'avantage est que cela nous évite d'écrire des conditions supplémentaires :

Il est possible de passer un nombre représentant le nombre de boucles à stopper (structure imbriquée)
$data = [ 1024, 8, 32, 256, 128, 512, 64, 16 ];
$toFind = 128;
$found = null;
$length = count( $data );

$i = 0;
while( $i < $length ){
  if( $toFind === $data[ $i ] ){
    $found = $data[ $i ];

    // On ajoute le break dans notre condition d'égalité
    break;
  }

  $i++;
}

echo $found;

Exemple trié

Dans le cas d'un tableau trié de manière croissante, nous pouvons ajouter une condition : si notre nombre recherché est plus grand ou égale à la valeur comparée alors nous sortons de la boucle :

$data: [ 8, 16, 32, 64, 128, 256, 512, 1024 ];
$toFind: 128;
$data = [ 8, 16, 32, 64, 128, 256, 512, 1024 ];
$toFind = 128;
$found = null;
$length = count( $data );

$i = 0;
while( ( $i < $length ) AND ( $found === null ) AND ( $toFind >= $data[ $i ] ) ){
  if( $toFind === $data[ $i ] ){
    $found = $data[ $i ];
    break;
  }

  $i++;
}

echo $found;

Amélioration

En utilisant break nous pouvons garder notre condition de boucle plus lisible tout en gardant une condition de sortie :

$data = [ 8, 16, 32, 64, 128, 256, 512, 1024 ];
$toFind = 128;
$found = null;
$length = count( $data );

$i = 0;
while( ( $i < $length ) AND ( $toFind >= $data[ $i ] ) ){
  if( $toFind === $data[ $i ] ){
    $found = $data[ $i ];
    break;
  }

  $i++;
}

echo $found;

Exercice A

Sur base du tableau suivant, ecrire une boucle de type for pour :

  • trouver le nombre 256
  • combien d'éléments strictement inférieurs
  • combien d'éléments strictement supérieurs
  • afficher trois phrase différentes présentant les résultats
$data = [ 1024, 8, 32, 256, 128, 512, 64, 16 ];

Exercice B

Sur base du tableau suivant, ecrire une boucle de type foreach pour :

  • trouver le nombre 432
  • calculer la moyenne des éléments strictement inférieurs
  • afficher 2 phrase différentes présentant les résultats
$data = [ 8, 16, 32, 64, 128, 256, 512, 1024, 2048 ];

Recherches dichotomiques

Définition

La recherche dichotomique, ou recherche par dichotomie est un algorithme de recherche pour trouver la position d'un élément dans un tableau trié.

Principe

Comparer l'élément avec la valeur de la case au milieu du tableau ; si les valeurs sont égales, la tâche est accomplie, sinon on recommence dans la moitié du tableau pertinente.

Propriétés

  • Structure des données triée
  • Efficacité et performance sur un large panel de données

Mise en place

Nous avons besoin de prévoir deux bornes, une commençant à 0 et l'autre la longueur de notre tableau moins un. Ensuite nous pouvons écrire une boucle while avec cette condition :

$data = [ 8, 16, 32, 64, 128, 256, 512, 1024 ];
$toFind = 128;
$found = null;

// Notre borne de départ
$left = 0;

// Notre borne de fin
$right = count( $data ) - 1;

while( $left <= $right ) {
  // Calcule la position de la case entre les 2 bornes
  $i = (int) ( ( $right + $left) / 2 );

  if( $toFind === $data[ $i ] ){
    $found = $data[ $i ];
    break;

  } else{

    if( $toFind < $data[ $i ] ){
      $right = $i - 1;

    } else {
      $left = $i + 1;
    }
  }
}

echo $found;

Exercice B

Sur base du tableau suivant, utiliser une recherche dichotomique pour :

  • trouver le pokemon ayant le niveau 32
$pokemons = [
  'roucool' => 4,
  'pikachu' => 8,
  'carabaffe' => 16,
  'onix' => 32,
  'dracaufeu' => 64,
  'mewtwo' => 128,
];

Exercice C

Dans un nouveau dossier d'exercice, créer un fichier index.php avec un tableau permettant de passer un nombre via un formulaire et récupérer sa valeur dans un fichier search.php pour effectuer une recherche dichotomique sur le tableau suivant :

$pokemons = [
  'roucool' => 4,
  'pikachu' => 8,
  'carabaffe' => 16,
  'onix' => 32,
  'dracaufeu' => 64,
  'mewtwo' => 128,
];

1/3

1/1