Comparaison de 2 Tableaux

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Ganagyre
Messages : 67
Inscription : jeu. 09/nov./2006 13:41
Localisation : PACA

Comparaison de 2 Tableaux

Message par Ganagyre »

Bonjour.

Pour une comparaison ligne par ligne de 2 tableaux de taille identique style :

Dim TBL_Original.l(15,65000)
&
DIM TBL_Clone.l(15,65000)

avec le résultat de comparaison en tableau

DIM Communs.l(65000)

Existe'il une methode plus "pratique/rapide" que la double boucle de recherche (colonnes/lignes) ?
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Message par Fig »

Tu crée 4 threads parallèles qui comparent chacun un quart des tableaux.:idea:
Les routines tu peux éventuellement les réécrire en asm.
Sinon, je ne vois pas comment traiter chaque élément des tableaux sans les prendre un par un... ou alors, au lieu de comparer chaque ligne tu compare des valeurs représentative de ces lignes. (genre checksum modulo, md5...)
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

un comparememory() sur l'adresse mémoire du tableau.

le problème reste tes colonnes.
je pense que tu va devoir écrire ton tableau comme ceci
dim tableau(65000, 15)
pour pouvoir comparer une ligne complète (qui sera donc dans une zone mémoire continu)

pas trop le temps de pondre un code exemple sur le pouce, je verrais plus tard si tu ne trouves pas. excuse moi

++
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Anonyme

Message par Anonyme »

@Ganagyre

Si tu maitrises les pointeurs , c'est la meilleur solution.

Code : Tout sélectionner

Structure MaStruct
 *Datas.i
 SizeX.i
 SizeY.i
EndStructure


Procedure.i Dim2D(SizeX,SizeY)

*Tab.MaStruct = AllocateMemory(SizeOf(MaStruct))  ; La Racine
*Tab\Datas    = AllocateMemory(SizeX*SizeY*4)     ; Les données
*Tab\SizeX    = SizeX ; Les infos de tailles
*Tab\SizeY    = SizeY

ProcedureReturn *Tab
EndProcedure



Procedure AddElement_(*Tab.MaStruct,x,y,value)
If x=>0 And y=>0 And x < *Tab\SizeX And y < *Tab\SizeY
 PokeL(*Tab\Datas + x + *Tab\SizeX * y,value)
EndIf 
EndProcedure

Procedure GetElement_(*Tab.MaStruct,x,y)
If x=>0 And y=>0 And x < *Tab\SizeX And y < *Tab\SizeY
 ProcedureReturn PeekL(*Tab\Datas + x + *Tab\SizeX * y)
EndIf 
EndProcedure




;-TEST


MonTableau = Dim2D(15,65535)

For i = 0 To 65535
AddElement_(MonTableau,1,i,Random(65535))
Next 

For i = 0 To 10
Debug GetElement_(MonTableau,1,i)
Next
Avatar de l’utilisateur
Ganagyre
Messages : 67
Inscription : jeu. 09/nov./2006 13:41
Localisation : PACA

Message par Ganagyre »

Bonjour.

Threads, asm, comparememory(), et le code de Cpl.Bator.

Apres reflexion sur vos infos et recherche d'exemples sur le forum, il semble possible de reduire à une "colonne" comme le préconise
Le Soldat Inconnu.

Code : Tout sélectionner

; ==========================
Lignes.l = 65000
colonnes.L =15

test.l = 1  ; nombre de test à effectuer

total.l = Lignes*colonnes

;Debug total

Dim origine.l(total)
Dim clone.l(total)
Dim resultat.l(total)

;===========================
; Remplir Tableau Origine
;===========================
For dd.l = 1 To total
  origine(dd) = Random(20)+1
Next dd
;============================ Comparaison Origine / Clone / Ecrire Resultat

For t = 1 To test
  For i = 1 To total  

    clone(i) = Random(20)+1 ; Remplir Tableau Clone

;------- Controle Origine vs Clone ------

If origine(i)>0 And origine(i) = clone(i)
      resultat(i) = 1
        Else
          resultat(i) = 0
EndIf 
;Debug origine(i)
;Debug clone(i)
;Debug Resultat(i)
  Next i
Next t
;
Cela ne fait plus que 2 listes à comparer avec comme resultat = 1 si 2 valeurs sont communes (et >0) origine/clone.
= = = =
Questions

Pour utiliser comparememory, de quelle maniere proceder ?
=
Cpl.Bator, le code utilisant "les pointeurs" est d'une rare velocité,
en modifiant

MonTableau = Dim2D(15,65535)
For i = 0 To 65535

par

MonTableau = Dim2D(15,100000000)
For i = 0 To 100000000

Une poignée de segondes/30s.

Hum, juste que je ne comprends pas la totalité du code, les 10 resultats rendu par : Debug GetElement_(MonTableau,1,i) ils correspondent à quoi ?

Merci à tous pour vos infos.
Anonyme

Message par Anonyme »

MonTableau = Dim2D(15,65535)
Je créer un tableau à deux dimensions , 15 & 65535 colonnes

For i = 0 To 65535
AddElement_(MonTableau,1,i,Random(65535))
Next
J'ajoute 65536 éléments dans la colonne 1 ( valeur au pif avec Random() )

For i = 0 To 10
Debug GetElement_(MonTableau,1,i)
Next
Je lis les 11 premiers élément de la 1° colonne avec un simple debug
Avatar de l’utilisateur
Ganagyre
Messages : 67
Inscription : jeu. 09/nov./2006 13:41
Localisation : PACA

Message par Ganagyre »

Cpl.Bator merci beaucoup pour ces precisions.
Répondre