Parcours de tableau

cs_racine Messages postés 11 Date d'inscription vendredi 10 janvier 2003 Statut Membre Dernière intervention 25 juillet 2008 - 20 mars 2007 à 18:54
MAXIMO71 Messages postés 46 Date d'inscription samedi 25 mars 2006 Statut Membre Derniè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)

Merci,
Olivier

7 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
20 mars 2007 à 19:08
Faut prendre l'habitude d'indexer en base 0, ton indice sera donc 3.

Un index indique l'offset de décalage rapport à l'adresse base, un index 0 indique donc bien le 1er élément.

ciao...
BruNews, MVP VC++
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
20 mars 2007 à 19:11
Salut,

en gros, ça devrait faire ça :

Dim TabARechercher(3) As Long, StartIndice As Long
Dim MonTableau() As Long, i As Long

TabARechercher =  Array(1, 1, 1)
MonTableau = Array(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

Erase TabARechercher
Erase MonTableau

~ <small> Mortalino ~ Colorisation automatique </small>

@++

<hr width ="100%" size="2" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
20 mars 2007 à 19:13
Ah et je confirme que suite à ce que dit BruNews, je suis bien en base 0 et StartIndice sera donc égal à 3

@++

<hr width="100%" size="2" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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

ciao...
BruNews, MVP VC++
0
cs_racine Messages postés 11 Date d'inscription vendredi 10 janvier 2003 Statut Membre Dernière intervention 25 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 : 

  MonTableau1 = Array(1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1)
  MonTableau2 = Array(1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1)
  MonTableau3 = Array(1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1)

je doit trouver l'endroit ou j'ai 3 fois 1 de suite dans l'ensemble de mes tableau (l'ensemble des tableaux doit approcher le million d'éléments)

resultat : 
  MonTableau1 = Array(1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1)
  MonTableau2 = Array(1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1)
  MonTableau3 = Array(1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1)

merci pour le tuyau, je vais assayer en effectuant des additions

A+
0
MAXIMO71 Messages postés 46 Date d'inscription samedi 25 mars 2006 Statut Membre Derniè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
0
Rejoignez-nous