Dichotomic search function for Sorted Array
Posted: Fri Aug 26, 2005 12:33 am
Code updated For 5.20+
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
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