Algorithmique Dichotomie

Fermé
Dredge3 - 28 nov. 2012 à 20:01
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 28 nov. 2012 à 21:20
Bonjour,
j'ai un exercice qui est :
Ecrire une fonction qui indique si un entier Val est présent dans une tableau T d'entiers à une dimension de taille N.Utiliser une recherche par dichotomie.(le tableau est bien entendu trié par ordre croissant)

J'ai fait cette Fonction : (je suis quasiment certain qu'elle est bonne, mais je suis sure qu'elle peut être amélioré)

Fonction Rechercher (T, N, Val) : booléen
Paramètres par valeur : T : Tableau [1..N] d'entiers
----------------------------Val, N : Entiers
Variables : Deb, Fin : Entiers
-------------Flag : booléen
Début
-----------Deb <== 1
-----------Fin <== N
-----------Flag <== Faux
---Répéter
---------------N <== (Deb + Fin) div 2
---------------Si T[N] = Val Alors
---------------------Flag <== vrai
---------------Sinon
---------------------Si Val < T[N] Alors
--------------------------Fin <== N
---------------------Sinon
--------------------------Deb <== N
---------------------Finsi
---------------Finsi
---jusqu'à [Deb = (Fin-1)] ou Flag = vrai
---Si Flag = vrai Alors
-------Retourner Flag
---Sinon
-------Si T[Deb] = Val ou T[Deb + 1] = Val Alors
------------Flag <== vrai
-------Finsi
---Finsi
---Retourner Flag
Fin

Pouvez vous me conseiller ?
Merci !

2 réponses

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
Modifié par KX le 28/11/2012 à 20:27
Je n'ai pas regardé en détail vu que tu es sûr que ta fonction est bonne, mais une amélioration est de penser récursif, ça simplifie le code (et l'esprit) :

C'est à dire appeler la fonction dans elle même :

Fonction Rechercher(T, N, Val) : Booléen
    Retourner Rechercher_Recursif(T,Val,1,N)
Fin

Fonction Rechercher_Recursif(T,Val,Deb,Fin) : Booléen
    Si (Deb >= Fin)
        Alors Retourner (Val = T[Start])
    Sinon
        Milieu <== (Deb+Fin)/2
        Si (Val = T[Milieu])
            Alors Retourner Vrai
        Sinon Si (Val < T[Milieu])
            Alors Retourner Rechercher_Recursif(T,Val,Deb,Milieu-1)
        Sinon
            Retouner Rechercher_Recursif(T,Val,Milieu+1,Fin)
        FinSi
    FinSi
Fin
La confiance n'exclut pas le contrôle
0
Bah justement j'aimerais éviter la récursivité (vu que je sais comment faire).
Tu peux regarder vite fait l'algorithme si tu as le temps ?
(Car je ne suis même pas sure qu'il soit correct)
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
28 nov. 2012 à 21:20
Je viens de faire une implémentation (vite fait), il semble que le résultat soit correct, sauf si N=1 ou N=2 dans ce cas la boucle tourne à l'infini...
0