cs_racine
Messages postés11Date d'inscriptionvendredi 10 janvier 2003StatutMembreDernière intervention25 juillet 2008
-
20 mars 2007 à 18:54
MAXIMO71
Messages postés46Date d'inscriptionsamedi 25 mars 2006StatutMembreDernière intervention 7 juin 2007
-
26 mai 2007 à 09:08
Bonjour,
Je recherche une méthode me permettant de rechercher dans un tableau de numériques , une suite particuliere de valeur.
Mon tableau fait plusieurs millions d'enregistrements, la recherche élément par élément est un peu lente.
ex : 1,0,0,1,1,1,0,1,1,1,1
je cherche 3 fois 1 de suite
reponse : indice de départ = 4 ( 1,0,0,1,1,1,0,1,1,1,1)
For i = LBound(MonTableau) To UBound(MonTableau) - 3
If TabARechercher(0) = MonTableau(i) And TabARechercher(1) = MonTableau(i + 1) And TabARechercher(2) = MonTableau(i + 2) Then
StartIndice = i: Exit For
End If
Next i
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 20 mars 2007 à 19:52
Je vois mal comment ne pas parcourur tous les éléments du tableau (celà me parait inévitanle)
Je vois par contre une possibilité de gagner en temps.
au lieu de comparer à 1 (donc une condition à chaque fois) : additionner ---
quelque chose du genre (îci je recense tous les départs d'occurrence dans une listbox, juste pour y voir clair)
Private Sub Command1_Click()
MonTableau = Array(1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1)
n = 0
For i = 0 To UBound(MonTableau) - 1
If MonTableau(i) > 0 Then
n = n + 1
Else
n = 0
End If
If n = 3 Then
List1.AddItem i - 2
n = 0
End If
Next
End Sub
C'est juste une idée et :
1) je n'ai pas testé n comparaison de temps
2) elle est surement perfectible
Vous n’avez pas trouvé la réponse que vous recherchez ?
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 20 mars 2007 à 20:36
Prends exemple sur ce qui t'a été donné plus haut par mortalino et jmfmarques.
Si vraiment tu bosses sur des tableaux de millions d'elems, ça risque fort de rester assez lent faute au "MonTableau(i)", l'accès aux elems par indexation est une calamité depuis vb en terme de performance.
Pour perfs incomparables, il te faudra compiler une dll C qui accèdera direct à la mémoire du tableau, tu devrais atteindre un benef facteur 10 minimum.
Exemple ici:
http://www.vbfrance.com/code.aspx?ID=33938
cs_racine
Messages postés11Date d'inscriptionvendredi 10 janvier 2003StatutMembreDernière intervention25 juillet 2008 21 mars 2007 à 09:30
Effectivement, il est difficile de ne pas parcourir le tableau.
d'autant plus que l'exemple ennoncer est incomplet. en réalité il serait plutot comme suit :
MAXIMO71
Messages postés46Date d'inscriptionsamedi 25 mars 2006StatutMembreDernière intervention 7 juin 2007 26 mai 2007 à 09:08
dim res (1 to 10000) as boolean
Max=UBound(MonTableau1)
for i = 0 to Max
MonTableau4(i)=MonTableau1(i)+MonTableau2(i)+MonTableau3(i)
next i
for i = 0 to Max
if MonTableau4(i)=3 and MonTableau4(i+1)=3 and MonTableau4(i+2)=3 then res( i+1) = true
next i
tu obtient ainsi la liste des résultats dans un tableau donc l'index de base est 1 ce qui te simplifie la tâche je pense. Pour ce qui est de l'accélération si le nombre d'occurance de ton tableau est fixe, il est possible d'utiliser dans la boucle de recherche des multiples de i ce qui va augmenter le nombre de tests par tour de boucle ce qui peut être plus rapide.
next i
MAXIMO71
PS Si la réponse vous satistait
pensez à la valider