mullo (Normal User)
Rookie
Messaggi: 37
Iscritto: 16/03/2010
|
Ho dieci array di dimensioni uguali, contenuti diversi, ma solo numeri interi. Come posso confrontare questi numeri in modo da trovare i tre array che hanno i valori più simili tra loro?
Per simili intendo: nello spazio 0 dell' array A ho il valore 50, nello spazio 0 dell' array B ho il valore 30, nello spazio 0 dell' array C ho il valore 48. Quindi tra questi A e C sono i più simili, ma ovviamente il confronto andrebbe fatto con tutti gli spazi.
Spero di essermi spiegato bene...
Ultima modifica effettuata da mullo il 18/01/2012 alle 17:41 |
|
subazu (Normal User)
Rookie
Messaggi: 35
Iscritto: 06/08/2011
|
Io farei cosi:
Allochi un array da numeroArray elementi, nel tuo caso da 0 a 9, qualsiasi sia la dimensione degli array da confrontare, di tipo intero e lo inizializzi tutto a 0.
Cicli sulla grandezza degli array grandi e per ogni copia di elementi fai:
valore assoluto ( elementoArray1 - elementoArray2 )
cosi facendo trovi la distanza tra i 2 numeri
es:
+10, + 7 -> 10 - 7 = 3 ; 7 - 10 = 3
-10, - 10 -> -10 + 10 = 0
-10, +10 -> -10 - 10 = 20
Sommi al valore esistente nell'array piccolo il valore trovato.
Alla fine nell'array piccolo hai le distanze tra gli array.
Non ho alcuna conoscenza di Java però
Edit:
Rileggendo il tuo post mi sono accorto di aver interpretato male il tuo problema.
L'esempio del valore assoluto è ancora valido, ma serve unicamente per calcolare la distanza fra 2 numeri.
Invece l'array piccolo, quello con i risultati non sarà grande come il numero di Array contenenti i dati, ma come il numero di terzine che ci sono, che se non sbaglio è uguale a: n * (n - 1) * (N - 2) con n = 10 nel tuo caso.
Ultima modifica effettuata da subazu il 18/01/2012 alle 22:57 |
|
mullo (Normal User)
Rookie
Messaggi: 37
Iscritto: 16/03/2010
|
Mmm che casino, mi hai un po' confuso con "array grandi" e "piccoli", proverò a rileggere con calma. Comunque il discorso del valore assoluto mi pare vada bene in effetti, magari domani provo a vedere cosa riesco a fare.
|
|
mullo (Normal User)
Rookie
Messaggi: 37
Iscritto: 16/03/2010
|
Allora... è tutta la mattina che mi sto incasinando la testa e il risultato è questo: a creare un array grande che mi contenga i vari array di numeri non ci riesco, comunque quello che ho fatto è creare un array di 10 stringhe, in cui ogni stringa contiene i vari numeri (uno per riga) degli array. Ora quindi dovrei fare il confronto di queste stringhe riga per riga, ma prima dovrei convertirli in interi immagino no? Come devo fare? Io ho fatto questo:
Codice sorgente - presumibilmente Java |
for(int i=0; i<arrayStringhe.length; i++){ int numeri = Integer. parseInt(arrayStringhe [i ]); }
|
L'output mi restituisce tutti i numeri ma anche un NumberFormatException.forInputString .
Se conoscete un metodo più semplice per piacere illuminatemi.
Edit: non ha molto senso convertire numeri in stringa per poi riconvertirli in numeri... quindi se qualcuno mi sa dire come fare l'array grande sarebbe meglio.
Ultima modifica effettuata da mullo il 19/01/2012 alle 14:28 |
|
subazu (Normal User)
Rookie
Messaggi: 35
Iscritto: 06/08/2011
|
Ripeto che non so nulla di Java, cercherò di copiare la sintassi da quello che mi scrivi, devi quindi interpretare il mio codice.
Io partirei dal basso con una funzione che calcola prima la distanza tra 2 interi e poi una funzioncina che calcola la distanza tra un array ed un altro sai?
Function IntDistance (N1,N2:Intero ) : Intero
Return abs(N1-N2)
End function
Function Distance2Array ( V1,V2:TipoVettore) : Intero
Int N = 0
for(int i=0; i<V1.length; i++)
N = N + IntDistance(V1(i),V2(i))
End function
Ora dobbiamo trovare la distanza tra 3 array quindi SE HO CAPITO BENE è così:
Function Distance3Array ( V1,V2,V3:TipoVettore) : Intero
Int N = 0
N = N + Distance2Array(V1,V2)
N = N + Distance2Array(V2,V3)
N = N + Distance2Array(V3,V1)
Return N
End Function
E fino a qui penso sia semplice :-)
Il problema più grande è quello di creare le trie, questo perchè:
con 10 array ci sono 10*9*8 = 720 combinazioni di trie.
es:
1 - 1 2 3
2 - 2 3 1 (si questa è uguale alla prima)
3 - 1 2 4
4 - 3 5 6
5 ... fino a 720
Oppure ci sono queste trie:
1 - 123
2 - 234
3 - 345
4 - 456
5 ... fino a 10
E qui non ho capito bene quale tipo di confronti vuoi fare...
|
|
mullo (Normal User)
Rookie
Messaggi: 37
Iscritto: 16/03/2010
|
No, per fortuna il mio caso è più semplice. In pratica devo fare questo:
Array A= 10, 20, 30, 45
Array B= 10, 15, 50, 60
differenze: 10-10=0, 20-15=5, 50-30=20, 60-45= 15
totale differenza: 0+5+20+15= 40
E fare questo confronto con ogni array per trovare i tre che hanno il totale differenza minore.
Se fai il conto AB, AC, AD, etc... BC, BD, BE, etc... sono 9+8+7+...+1 = 45 combinazioni.
Tieni conto che ogni array mi viene generato all'interno di un ciclo for... come salvo i contenuti di ogni array in modo che poi possa usarli per confrontarli?
|
|
subazu (Normal User)
Rookie
Messaggi: 35
Iscritto: 06/08/2011
|
Ah ok tutto chiaro, pensavo che tu dovessi trovare i 3 array che avessero tra di loro in minor numero di differenze
Bene è tutto molto semplice
Invece di usare un array monodimensionale ne usi uno bidimensionale, anche detta matrice o tabella, che non è altro che un Array di Array
int nElementi = 500
int nArray = 10
int data(nElementi)(nAray)
int ressults(sommaNElementi(narray))
int k = 0
for(int i=0; i<nArray ; i++)
for(int j=i+1; j<nArray ; i++)
results(k) = Distance2Array (data(i),data(j))
k = k +1
Ora in results hai il valore di tutti i confronti
Ultima modifica effettuata da subazu il 19/01/2012 alle 20:16 |
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
Usate i tag CODE per racchiudere il codice. E' così difficile leggere il regolamento?
@subazu: non capisco quanti elementi abbia results. Ci sono alcuni errori nel tuo codice:
Codice sorgente - presumibilmente Java |
int nElementi = 500 int nArray = 10 int data(nArray)(nElementi) int results(nArray * nArray) int k = 0 for(int i = 0; i < nArray - 1; i++) for(int j = i + 1; j < nArray; j++) results(k) = Distance2Array(data(i),data(j)) k = k + 1
|
L'approccio di programmazione dinamica di subazu è corretto. Si può migliorare usando una tecnica branch&bound, dove il bound è la massima differenza tra le tre coppie di array fin'ora trovate con differenze minori.
|
|
mullo (Normal User)
Rookie
Messaggi: 37
Iscritto: 16/03/2010
|
Scusate ma io non ci sto capendo niente...
premetto che questa notazione nel codice neanche la conosco: int data(nArray)(nElementi);
cosa significa quando ci sono le due parentesi vicine? Infatti quella parte mi dà anche degli errori "error: ';' expected"
Comunque vi scrivo parte del codice così capite meglio la struttura:
Codice sorgente - presumibilmente Java |
File[] files = f. listFiles(); for(int k = 0; k < files.length; k++){ //per ogni file contenuto nella cartella (ne metto 10), questo genera un array MioArray[] di 256 valori int[] mioArray = new int[256]; for(int i=0;i<arrayP.length;i++){ mioArray[arrayP[i]]++; arrayP[i] = 0xff000000 | arrayP[i] * 0x10101; } } }
|
Quindi all'esterno del ciclo for() devo salvare questi 10 array e fare i confronti di cui parlavo.
Ultima modifica effettuata da mullo il 20/01/2012 alle 16:28 |
|