Recherche d'un élément. Recherche dans un tableau trié

Documents pareils
Recherche dans un tableau

Complexité. Licence Informatique - Semestre 2 - Algorithmique et Programmation

6. Hachage. Accès aux données d'une table avec un temps constant Utilisation d'une fonction pour le calcul d'adresses

1 Recherche en table par balayage

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Cours Informatique Master STEP

Algorithmique et Programmation, IMA

Architecture des Systèmes d Information Architecture des Systèmes d Information

Algorithmes récursifs

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

introduction Chapitre 5 Récursivité Exemples mathématiques Fonction factorielle ø est un arbre (vide) Images récursives

CORRECTION EXERCICES ALGORITHME 1

Bases de programmation. Cours 5. Structurer les données

Programme Compte bancaire (code)


Cours d Informatique

Chapitre 10. Les interfaces Comparable et Comparator 1

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

LE PROBLEME DU PLUS COURT CHEMIN

ALGORITHMIQUE ET PROGRAMMATION En C

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Feuille TD n 1 Exercices d algorithmique éléments de correction

4. Les structures de données statiques

Algorithmique, Structures de données et langage C

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Cours d initiation à la programmation en C++ Johann Cuenin

Adama MBODJI MBODJ.SYSTEM

Bases de données documentaires et distribuées Cours NFE04

Programmation linéaire

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

Système binaire. Algèbre booléenne

ÉPREUVE COMMUNE DE TIPE Partie D

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Projet L1, S2, 2015: Simulation de fourmis, Soutenance la semaine du 4 mai.

# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

Programmation Orientée Objet Java

Programmation C++ (débutant)/instructions for, while et do...while

Fonctions de plusieurs variables : dérivés partielles, diérentielle. Fonctions composées. Fonctions de classe C 1. Exemples

Définitions. Numéro à préciser. (Durée : )

LES TYPES DE DONNÉES DU LANGAGE PASCAL

FctsAffines.nb 1. Mathématiques, 1-ère année Edition Fonctions affines

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Initiation à la programmation en Python

1 de 46. Algorithmique. Trouver et Trier. Florent Hivert. Mél : Florent.Hivert@lri.fr Page personnelle : hivert

RMI le langage Java XII-1 JMF

Vous venez de procéder à la mise à jour? Découvrez les nouveautés de Microsoft Dynamics CRM 2013 et Microsoft Dynamics CRM Online, automne 2013

Assurance Qualité. Cours de génie logiciel. Renaud Marlet. LaBRI / INRIA (d'après A.-M. Hugues) màj 23/04/2007

Résolution d équations non linéaires

Les fonctions de hachage, un domaine à la mode

Navigation dans Windows

ARBRES BINAIRES DE RECHERCHE

Sujet proposé par Yves M. LEROY. Cet examen se compose d un exercice et de deux problèmes. Ces trois parties sont indépendantes.

6 - Le système de gestion de fichiers F. Boyer, UJF-Laboratoire Lig, Fabienne.Boyer@imag.fr

Généralités sur le Langage Java et éléments syntaxiques.

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Structures dynamiques Listes chaînées

URECA Initiation Matlab 2 Laurent Ott. Initiation Matlab 2

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

2 Grad Info Soir Langage C++ Juin Projet BANQUE

Optimisations des SGBDR. Étude de cas : MySQL

LES NOMBRES DECIMAUX. I. Les programmes

1. Structure d'un programme FORTRAN 95

SUPPORT DE COURS. Dr. Omari Mohammed Maître de Conférences Classe A Université d Adrar Courriel : omarinmt@gmail.com

CHAPITRE V. Recherche et tri

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Utilisation d objets : String et ArrayList

Systèmes de transmission

1 La société GIR. 2 La solution proposée

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février :30 à 20:30

COMPTABILITE SAGE LIGNE 100

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Plan du cours. Historique du langage Nouveautés de Java 7

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Séquence de découverte de SparkAngels Logiciel d entraide numérique

ALGORITHMIQUE II NOTION DE COMPLEXITE. SMI AlgoII

CHAPITRE VIII : Les circuits avec résistances ohmiques

ACTIVITÉ DE PROGRAMMATION

NOTATIONS PRÉLIMINAIRES

Chapitre VI - Méthodes de factorisation

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

FORMULAIRE DE STATISTIQUES

Calcul de développements de Puiseux et application au calcul du groupe de monodromie d'une courbe algébrique plane

Programmation Par Objets

Grandes lignes ASTRÉE. Logiciels critiques. Outils de certification classiques. Inspection manuelle. Definition. Test

Cryptographie. Master de cryptographie Architectures PKI. 23 mars Université Rennes 1

Cours 14 Les fichiers

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Les différents types de données et leurs opérations de base

UE C avancé cours 1: introduction et révisions

TD/TP PAC - Programmation n 3

Examen Médian - 1 heure 30

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Mystères au PLUS! Jeu pédagogique pour les Sciences de la Vie et de la. Frédéric BLASSELLE, PLUS de Cappelle-la-Grande

Déroulement. Evaluation. Préambule. Définition. Définition. Algorithmes et structures de données 28/09/2009

I00 Éléments d architecture

1. Introduction Création d'une requête...2

Gestion des Clés. Pr Belkhir Abdelkader. 10/04/2013 Pr BELKHIR Abdelkader

Transcription:

Recherche d'un élément Recherche par parcours séquentiel : on parcourt le tableau séquentiellement jusqu'à ce qu'on trouve l'élément Exemple : recherche séquentielle dans un tableau de chaines // cette fonction renvoie vrai si x est présente dans tab, faux fonction avec retour booléen rechercheelement1(chaine[] tab, chaine x) entier i; tantque (i < tab.longueur) faire si (tab[i] = x) alors retourne VRAI; i <- i + 1; 1 Recherche dans un tableau trié Si le tableau est trié par ordre croissant, on peut s'arrêter dès que la valeur rencontrée est plus grande que la valeur cherchée (ou plus petite si le tableau est trié par ordre décroissant) // cette fonction renvoie vrai si x est présente dans tab, faux // le tableau tab est supposé trié par ordre croissant fonction avec retour booléen rechercheelement2(chaine[] tab, chaine x) entier i; tantque (i < tab.longueur) faire si (tab[i] = x) alors retourne VRAI; si (tab[i] > x) alors i <- i + 1; 2

Recherche multidimensionnelle Dans un tableau multidimensionnel, une double boucle est nécessaire pour rechercher un élément // cette fonction renvoie vrai si x est présente dans tab, faux fonction avec retour booléen rechercheelement3(chaine[][] tab, chaine x) entier i,j; tantque (i < tab.longueur) faire j <- 0; tantque (j < tab[i].longueur) faire si (tab[i][j] = x) alors retourne VRAI; j <- j + 1; i <- i + 1; 3 Recherche des occurences Si on suppose que la valeur recherchée peut apparaître plusieurs fois dans le tableau, on peut vouloir retourner le nombre d'occurences de la valeur // cette fonction renvoie le nombre de fois où x est présente dans tab fonction avec retour entier rechercheelement4(chaine[] tab, chaine x) entier i, nboc; nboc <- 0; tantque (i < tab.longueur) faire si (tab[i] == x) alors nboc <- nboc + 1; i <- i + 1; retourne nboc; 4

Tableau associatif (1/3) Dans un tableau classique indicé par des entiers, les indices n'ont aucun rapport avec les valeurs des cases, il ne font qu'indiquer une position Mais si l'indice permet d'identifier la valeur de la case, la recherche de la présence de la valeur est facilitée : il suffit de vérifier que l'indice existe Exemple : les numéros d'étudiant ne permettent pas de retrouver un étudiant dont on connait le nom un tableau d'étudiants indicé par les noms des étudiants permettrait de retrouver directement un étudiant dont on connait le nom Il faut bien choisir l'élément qui identifie les valeurs : la clé 5 Tableau associatif (2/3) Les tableaux associatifs sont des tableaux dont les indices sont pris dans n'importe quel sous ensemble i de valeurs d'un type donné (composé ou non) les indices sont appelés les clés et chaque case est un couple clé-valeur Exemple : tableau de valeurs du type Personne indicé par des chaines de caractères (les noms des personnes) prénom : Robert nom : Toto age : 29 métier : informaticien prénom : Marcel... nom : Tutu age : 31 métier : boulanger prénom : Julie nom : Titi age : 28 métier : professeur case «Toto» case «Tutu» case «Titi» 6

Tableau associatif (3/3) Problèmes posés par les tableaux associatifs : il vaut mieux que les clés soient toutes différentes pour éviter les ambiguités travailler avec de «gros» indices n'est pas efficace par rapport aux indices entiers Comment choisir entre tableau à indice entier et tableau associatif? travailler avec des indices entiers, qui occupent peu de place en mémoire, mais obligent à parcourir le tableau pour trouver un élément solution très efficace quant à l'occupation mémoire, la pire quand au temps de recherche travailler avec des indices complexes (clés) qui identifient les valeurs des cases et permettent de trouver un élément en un seul accès au tableau solution optimum quant au temps de recherche, mais très inefficace quant à l'occupation mémoire problème d'ambiguités potentielles à gérer Compromis entre les deux : le hachage 7 Table de hachage (1/2) Principe d'une table de hachage : les éléments sont identifiés par leurs clés mais placés dans un tableau indicé par des entiers pour savoir dans quelle case placer un élément, on utilise une fonction de hachage qui à toute clé associe un entier la place occupée en mémoire est faible comparée à un tableau associatif, mais l'accès à une case demande un petit calcul (moins gourmand généralement que la comparaison de grosses clés) clé "Toto" clé "Tutu" clé "Titi" clé "Tata" Fonction de hachage Table de hachage 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Personne Toto Personne Tutu Personne Titi Personne Tata 8

Table de hachage (2/2) Exemple : on doit ranger dans un tableau N enregistrements de type Personne et on veut utiliser les noms des personnes comme clés (en supposant qu'il n'y a pas d'homonyme) une manière de hacher les noms consiste à construire une représentation numérique des noms à l'aide des codes ASCII des caractères, puis à prendre pour indice ce nombre modulo N pour chaque nom x, de longueur l, l'indice de l'enregistrement correspondant sera : h(x) = ( i=1..l x[i] B l-i ) mod N où B est un nombre choisi plus grand que N et premier généralement pour un tableau de 5 cases (N=5), on aura pour hachage des chaines "Toto" "Titi" et "Tutu" les valeurs 2, 0 et 4 9 Fonction de hachage L'idéal est que la fonction de hachage soit injective : deux clés différentes ont deux indices de hachage différents il n'y a pas d'ambiguité lors d'un accès en cryptographie, cette contrainte est forte (la fonction doit être quasiment injective) Si la fonction de hachage n'est pas injective, il peut y avoir deux clés différentes qui ont la même valeur de hachage on parle de collision : l'accès à l'élément à partir de sa clé peut conduire à un autre élément c'est le cas de beaucoup de fonctions de hachage car le nombre de clés possible est souvent plus grand que la quantité d'indices utilisés le but étant d'accélérer l'accès aux éléments, plutôt que d'alourdir le calcul pour avoir une fonction injective, on complexifie la structure de données pour résoudre les collisions 10

Résolution des collisions Chainage externe (ou séparé ou ouvert) : chaque case du tableau contient non pas un élément mais la liste des éléments dont la clé a pour valeur de hachage l'indice de la case problème : la recherche se fait sur deux niveaux et n'est plus immédiate 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 toto titi tutu riri fifi loulou Chainage fermé : on met les éléments ayant même valeur de hachage dans d'autres cases disponibles. Plusieurs stratégies : sondage linéaire : on place les éléments dans des cases contigues, et pour les retrouver, on parcourt séquentiellement les cases contigues hachage double : une deuxième fonction de hachage détermine la case où sera placer l'élément, et permet de le retrouver sondage quadratique : on place les éléments dans des cases situées à une distance qui dépend quadratiquement de l'indice... 11 Table de hachage en Java EnJava, la classe Hashtable implémente une table de hachage. // création d'une table de hachage avec clés de type chaine et valeurs // de type Personne Hashtable<String,Personne> ht = new Hashtable<String,Personne>(); // ajout d'une valeur dans la table : clé "Toto", valeur : une Personne Personne toto = new Personne("Toto", "Robert", 24); ht.put("toto",toto); // récupérer la valeur associée à la clé "Toto" Personne p = ht.get("toto"); Les clés utilisées doivent être des «objets» ayant un code de hachage. Ce code est retourné par la méthode hashcode() Exemple : la classe String possède cette méthode String totoname = new String("Toto"); totoname.hashcode(); // retourne 2612822 int index = totoname.hashcode()%5; // index vaut 2 12

Recherche par dichotomie (1/3) La structure de données utilisée influe sur l'efficacité de la recherche d'un élément, mais la stratégie de recherche peut également jouer sur l'efficacité Principe de la recherche par dichotomie (du grec dikhotomia, division en deux parties égales) ou recherche binaire : on sépare en deux parties égales les données d'entrée on relance la recherche sur chacune des parties ou sur une seule Dans le cas général, si on doit relancer la recherche sur les deux parties, ça n'apporte rien en terme d'efficacité L'intérêt apparait si on peut ne traiter qu'une des sous parties dans la recherche d'un élément dans un tableau, si le tableau est trié, on peut ne traiter qu'une des sous parties 14

Recherche par dichotomie (2/3) On travaille sur les cases d'indices compris entre i et j. Cet intervalle est divisé par 2 à chaque itération. // cette fonction renvoie vrai si x est présente dans tab, faux // le tableau tab est supposé trié par ordre croissant fonction avec retour booléen rechercheelement3(chaine[] tab, chaine x) entier i, j; j <- tab.longueur-1; tantque (i <= j) faire si (tab[(j+i)/2] = x) alors retourne VRAI; si (tab[(j+i)/2] > x) alors j <- (j+i)/2-1; i <- (j+i)/2 + 1; 15 Recherche par dichotomie (3/3) Exemple : on applique l'algorithme précédent sur un tableau trié d'entiers et on cherche si 490 est présent dans le tableau. 4 17 25 26 45 45 87 102 234 237 490 1213 5681 5690 7012 234 237 490 1213 5681 5690 7012 234 237 490 490 16

Recherche par interpolation (1/2) Remarque : si on cherche zèbre dans le dictionnaire, on ouvre le dictionnaire vers la, pas au milieu Recherche par interpolation : on améliore la dichotomie en cherchant à couper le tableau non pas au milieu, mais à un endroit proche de la valeur cherchée cela nécessite de pouvoir évaluer (par interpolation) la position probable de la valeur cherchée, et donc que la répartition des valeurs suive à peu près une fonction connue Si on suppose une répartition ordonnée et linéaire des valeurs dans le tableau, on peut interpoler linéairement la place de l'élément recherché si tab est le tableau et e l'élément cherché, l'indice de e est interpolé par (e tab[0]) * tab.longueur/(tab[tab.longueur 1] tab[0]) 17 Recherche par interpolation (2/2) Dans le tableau jaune, la formule d'interpolation linéaire donne 1 comme indice probable de 490 (l'indice réel est 11) Dans le tableau rouge, la formule d'interpolation linéaire donne 8 comme indice probable de 71 (l'indice réel est 8) 4 17 25 26 45 45 87 102 234 237 490 1213 5681 5690 7012 8000 140 7000 6000 5000 4000 3000 2000 1000 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 120 100 80 60 40 20 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 4 17 25 26 45 45 63 71 77 89 98 101 104 112 124 18