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) ?
Comparaison de 2 Tableaux
Tu crée 4 threads parallèles qui comparent chacun un quart des tableaux.
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...)

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...)
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
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
++
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)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
@Ganagyre
Si tu maitrises les pointeurs , c'est la meilleur solution.
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
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.
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.
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
;
= = = =
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.
Je créer un tableau à deux dimensions , 15 & 65535 colonnesMonTableau = Dim2D(15,65535)
J'ajoute 65536 éléments dans la colonne 1 ( valeur au pif avec Random() )For i = 0 To 65535
AddElement_(MonTableau,1,i,Random(65535))
Next
Je lis les 11 premiers élément de la 1° colonne avec un simple debugFor i = 0 To 10
Debug GetElement_(MonTableau,1,i)
Next