Page 1 sur 1

Comparaison de 2 Tableaux

Publié : mar. 05/mai/2009 11:18
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) ?

Publié : mar. 05/mai/2009 11:52
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...)

Publié : mar. 05/mai/2009 17:01
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

++

Publié : mar. 05/mai/2009 19:11
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

Publié : jeu. 07/mai/2009 13:34
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.

Publié : jeu. 07/mai/2009 16:51
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

Publié : ven. 08/mai/2009 7:50
par Ganagyre
Cpl.Bator merci beaucoup pour ces precisions.