Newsgroup: it.comp.lang.visual-basic
Titolo: [net]Confronto tra array

Salve, 2 quesiti:
1) due array di byte, con un uguale numero di elementi. Qual è il metodo più
veloce per vedere se sono uguali, se cioè ciascun elemento di un array è
uguale all'elemento corrispondente dell'altro?
Array1.equals(Array2) non funziona, e ciclare su tutti gli elementi porta
via una marea di tempo.
2) sempre due array, questa volta di dimensioni diverse: è possibile cercare
se all'interno del primo array è presente il secondo? Una cosa del tipo:
A1(0) = 2
A1(1) = 5
A1(2) = 7
A2(0) = 5
A2(1) = 7
Ringraziamenti anticipati
Salutoni
Sergio


  La butto li, se li trasformi con .ToString e poi fai tutti i confornti del
caso?
Ciao
--------------------------------
Inviato via 
http://usenet.libero.it


Per il momento l'unica cosa che mi viene mente č tenere, se č
possibile, i due array ordinati e fermarsi alla prima differenza.

 possibile, i due array ordinati e fermarsi alla prima differenza.
attualmente, per cercare le ricorrenze di un array in un altro (che è il
problema "finale" che sto cercando di risolvere) faccio una cosa del tipo
(lasciando perdere le dichiarazioni ;-) ):
for i = 0 to array1.length - array2.length
    errore = false
    for j = 0 to array2.length -1
        if array1(i+j) <> array2(j) then
            errore = true
            exit for
        end if
    next
    if not errore
        'trovata una occorrenza
        i += array2.length
    end if
next
che mi pare sostanzialmente quello che suggerisci tu. Se, come può
succedere, array1 è costituito da 10^6 elementi, ci mette una marea di
tempo.
Sto attualmente cercando qualcosa di più veloce, in direzione di un
fantomatico confronto di aree di memoria. Se qualcuno ha qualche idea la
accetto volentieri, l'unico limite è che fino a stasera non posso provarle.
Risalutoni e riringraziamenti
Sergio

fantomatico confronto di aree di memoria. Se qualcuno ha qualche idea la
Solo un idea, non appartite al framework ma è un API e si chiama
CopyMemory e permette di copiare un area di memoria in un altra ed è
usata in questo esempio
http://www.vb2themax.com/Item.asp?PageID=TipBank&ID=325
Magari non ti serve a nulla però è interessante quando copia la
struttura all'interno di una stringa con il copymemory e poi confronta
la stringa

 > porta via una marea di tempo.
Tempo fa dovetti eseguire uno studio di confronto tra due sorgenti, campi di
tabelle, escludere le uguaglianze e visualizzare
le differenze.
Il primo problema che mi si presentò la instabilità della maggioranza del
numero dei record.
Alcune volte il campo1 aveva un numero di record maggiore di campo2, altre
volte l'inverso.
Alla fine decisi di utilizzare il metodo Sort della classe System.Array, che
permette un ordinamento unidimensionale,
per il confronto tra i singoli elementi che compongono le matrici.
L'esempio è presente:
http://www.it-lang-vb.net/
Nome proggetto: ConfrontoArray
Per evitare di ciclare tutti gli elementi, per verificare se sono uguali:
1- costruzione dei due System.Array
2- Sort
3- Concatenare i valori stringa con la classe System.Text.StringBuilder (è
velocissima)
4- Utilizzare il metodo StringBuilder.Equals
Non mi vengono al momento altre idee.
Salve
giuseppeD

 4- Utilizzare il metodo StringBuilder.Equals
Perchè occorre fare il sort per confrontarli? E' un passaggio la cui utilità
mi sfugge. Forse mi sfugge proprio il significato del sort: se il suo
significato è quello di "ordinare" gli elementi, non inficia il successivo
confronto?
Sento distintamente il mononeurone rimbalzare impazzito all'interno della
cervice 8-(
Pensavo ci fosse, da qualche parte, una funzioncina, metodo o proprietà che
dicesse: eccoti due riferimenti, verifica se, a partire dal primo di
ciascuno di essi, i successivi n byte sono uguali.
Bah, intanto continuo la ricerca...
Salutoni
Sergio

 confornti del caso?
Mi fa un po' paura quel "ToString", devo prima verificare cosa restituisce.
Poi pare che la strada debba essere quella.
Cercando memcmp, che sarebbe la funzione del vecchio c che farebbe al caso
mio, su msdn, si viene gentilmente indirizzati, dopo qualche passaggio, al
seguente indirizzo
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/
vclrfrun-timeroutinesnetframeworkequivalents.asp
che parrebbe indicare che l'equivalente .net della funzione memcmp è da
ricercare nei confronti tra stringhe.
Salutoni
Sergio

 ciascuno di essi, i successivi n byte sono uguali.
Presumo che necessita passare gli elementi in una specifica leggibile dal
runtime
Salve
giuseppeD

 1.2- B(aa) ; B(bb) ; B(cc) ; B(dd)
perdonami, continuo a non capire. Probabilmente le ore di sonno perse
cominciano a dare i loro nefasti effetti.
Cosa sono quelle lettere tra parentesi?
Il passaggio successivo mi sembra piů "comprensibile": impacchetto il tutto
in una unica variabile di tipo valore e faccio il confronto diretto, ma č
ancora il sort che mi scombina...
Per fare un esempio di come vedo la cosa (il che rischia di esplicitare il
mio livello di fusione):
dim a() as string ={"Pippo","Paperino","Pluto"}
dim b() as string ={"Pluto", "Pippo"}
nelle mie intenzioni, il vettore b non č contenuto nel vettore a.
Ho il sospetto che invece, riordinandoli, otterrei:
a(0) = "Paperino"
a(1) = "Pippo"
a(2) = "Pluto"
b(0) = "Pippo"
b(1) = "Pluto"
e a questo punto b č contenuto in a....
quindi: cosa č che non ho capito di tutto il meccanismo?
Salutoni
Sergio

 b(1) = "Pluto"
'Costruzione del primo System.Array ad una dimensione
  Dim saTabella1 As System.Array =
System.Array.CreateInstance(GetType(String), numRec1)
Alimento l'Array 1
Eseguo il sort
 System.Array.Sort(saTabella1)
 'Costruzione del secondo System.Array ad una dimensione
 Dim saTabella2 As System.Array =
System.Array.CreateInstance(GetType(String), numRec2)
Alimento l'Array 2
Eseguo il sort
 System.Array.Sort(saTabella2)
A questo punto ho i due Array allienati.
Se sono uguali le due concatenazioni porterà a due System.Text.StringBuilder
uguali
Dim str1 As New System.Text.StringBuilder()
Costruzione str1 con saTabella1
Dim str2 As New System.Text.StringBuilder()
Costruzione str2 con saTabella2
Eseguo il confronto:
 If str1.Equals(str2) = True Then
                Console.WriteLine("Uguali")
            Else : Console.WriteLine("Diversi")
            End If
Salve
giuseppeD

Ci provo, non garantisco il risultato , fai qualche prova con array molto
grandi...
Imports System.Security.Cryptography
Public Function ArrayDif(ByVal array1() As Byte, ByVal array2() As Byte)
      Dim Hash1() As Byte = New
MD5CryptoServiceProvider().ComputeHash(array1)
      Dim Hash2() As Byte = New
MD5CryptoServiceProvider().ComputeHash(array2)
      For i As Int32 = 0 To 15
         If Hash1(i) <> Hash2(i) Then Return True
      Next
   End Function
HTH
-- 
Corrado Cavalli [Microsoft .NET MVP]
UGIdotNET - 
http://www.ugidotnet.org

[Giuseppe] scrisse:
(snip)
oh la'... bello fresco e riposato, riaffronto il problema....
Grazie per l'aiuto giuseppe, ma devo essermi spiegato male. Non mi interessa
sapere se gli elementi di un array sono presenti in un altro, a prescindere
dal loro ordine, situazione per la quale il sort è certo la soluzione più
razionale, la mia necessità è più simile ad un confronto tra stringhe: se
invece dell'elemento dell'array ci metti un carattere, la formalizzazione
del probleme diventa: trovare le occorrenze di una parola in una stringa
data. Tutti i tentativi che ho fatto ieri sera per trasformare l'array di
byte in stringa hanno dato esito negativo.
Lo stringbuilder non l'ho provato, anche perchè ho scoperto che potevo
ottimizzare parecchio la funzione in un'altra strada: quella che nella
analogia precedente è stata chiamata "stringa data" è una sequenza di valori
che può essere molto lunga, per cui sono costretto a lasciarla su disco e
caricare di volta in volta il pezzetto che mi serve. E' bastato modificare
la gestione della lettura dal disco (un buffer di byte invece che solo la
quantità necessaria al confronto) che i tempi si sono drammaticamente
ridotti: cercare una sequenza di 8 elementi all'interno di una di
500.000.000 porta via circa venti secondi, che mi paiono un tempo più che
accettabile.
Grazie ancora.
Salutoni
Sergio

 Imports System.Security.Cryptography
(snip)
Se non capisco male si tratta di passare ad un calcolo di tipo
"probabilistico": se due serie di valori danno lo stesso hash č molto
probabile che siano uguali. Ho capito bene?
Non credo mi sia utile in questa fase, come ho detto in un altro post facevo
un errore molto piů banale, ma č una ideuzza che conserverň
Grazie
Salutoni
Sergio

 restituisce. Poi pare che la strada debba essere quella.
No. ToString non restituisce niente di sensato, nel contesto.
Salutoni
Sergio