Hello everyone
There is a very fast search function for sorted array only. Sorry for the French comment and code. If soneone are willing to translate go for it !!
Regards
Guimauve
Code: Select all
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Nom du projet : Prototype de fouille Dichotomique
; Fichier : Code Expérimental
; Version : 0.0.0
; Programmation : En progression
; Programmé par : Guimauve
; Date : 25-08-2005
; Mise à jour : 25-08-2005
; Codé pour PureBasic V3.94
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; PRINCIPE DE FONCTIONNEMENT :
;
; On regarde l'element du milieu. S'il est trop petit,
; On recommence dans la partie de droite restante, sinon
; On recommence dans la partie de gauche restante.
; Ainsi, l'espace de recherche diminue de moitié a chaque
; fois.
;
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<<<<<< ! ! ! TRÈS TRÈS TRÈS IMPORTANT ! ! ! <<<<<<<<<<
;
; LE TABLEAU SUR LEQUEL LA FOUILLE EST EFFECTUÉE DOIT ÊTRE
; TRIÉ AVANT DE COMMENCER LA FOUILLE. SI NON LA FOUILLE NE
; FONCTIONNE PAS CORRECTEMENT.
;
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
#Nb_Element = 5
#Max_Random = 5000
Global Dim Tableau.l(#Nb_Element)
Procedure.l DichotomicSearch(ValeurRecherchee.l)
Position.l = -1
Debut.l = 0
Fin.l = #Nb_Element ; La grandeur du tableau
While Debut <= Fin
; On trouve le milieu de l'espace de recherche.
Milieu = Round((Debut + Fin) / 2,0)
; On conserve la moitie de droite ou de gauche de l'espace de
; recherche
If ValeurRecherchee < Tableau(Milieu)
Fin = Milieu - 1
ElseIf ValeurRecherchee > Tableau(Milieu)
Debut = Milieu + 1
;Si c'est égal, nous avons trouvé et on retourne la position du milieu
Else
Debut = Fin + 1
Position = Milieu
EndIf
Wend
ProcedureReturn Position
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; On met en place 6 valeurs aléatoire entre 0 et 100 dans le tableau
For index = 0 To #Nb_Element
Tableau(index) = Random(#Max_Random)
Next
; On trie le tableau pour que les plus petites valeurs se retrouve au début
SortArray(Tableau(),0)
Debug "On affiche le tableau"
For index = 0 To #Nb_Element
Debug Tableau(index)
Next
Debug "On commence à Fouiller dans le tableau"
; on passe toute les valeurs de 0 à 100 pour voir si elle se trouve dans le tableau
For index = 0 To #Max_Random
;StartTime = ElapsedMilliseconds()
Position = DichotomicSearch(index)
;ElapsedTime = ElapsedMilliseconds()-StartTime
; Debug "Temps de Fouille : " + Str(ElapsedTime)
If Position <> -1
Debug Str(index) + " trouvé à la position : " + Str(Position)
Debug "La valeur dans le tableau à cet index " + Str(Position) + " : " + Str(Tableau(Position))
EndIf
Next