PDA

View Full Version : matrice e ricerca valore con maggior numero di punti


omniaforever
18-05-2010, 20:18
mi servirebbe in c#(ma non è importante, mi basta uno pseudo codice) il seguente algoritmo..
data una matrice (una immagine in pratica) devo calcolare il colore dominante, ossia che si presenta più spesso..
considerando che ogni punto della matrice(pixel dell'immagine) è formato da 3 valori(rgb) mi serve sapere appunto qual è la terna che si presenta maggiormente..
l'importante che non sia troppo lento
grazie

deadlyomen17
18-05-2010, 22:17
un algoritmo semplice e non troppo costoso potrebbe essere questo:

crei una stringa che rappresenterà la soluzione, ovvero il colore dominante.
chiamiamola coloreDominante

crei una hashmap (chiave stringa, valore intero), la chiave sarà la stringa che rappresenta il colore e il valore sarà il numero di occorrenze di questo.
aggiungi all'hashmap una entry con chiave coloreDominante e valore 0.

cicli la matrice

per ogni cella i,j, ottieni il numero di occorrenze (count) del colore relativo, se non esiste lo inizializzi a 0; incrementi di 1 count e aggiorni l'hashmap;
se count è maggiore del valore massimo attuale, ovvero quello corrispondente alla chiave coloreDominante, aggiorni coloreDominante al colore attuale

alla fine del ciclo avrai il colore dominante e il suo numero di occorrenze.

costo O(nm), n righe, m colonne.

codice esempio:

matrice M;
coloreDominante = "nessuno";
hashmap<String, Integer> hash;
hash.put( coloreDominante, 0 );

for i ...
for j ...
count = hashmap.get( M[i][j] );
if( count == null )
count = 0;

hash.put( M[i][j], count++ );

if( count > hash.get(coloreDominante) )
coloreDominante = M[i][j];

omniaforever
19-05-2010, 00:02
grazie della risposta..in c# sarebbe hashtable?
dai un'occhiata qui please
http://www.sviluppo-software.info/2010/04/struttura-dati-hashtable-in-c.html
i metodi che mi hai scritto, gli equivalmenti sono Add(per put), ma non ho capito l'equivalente del get (credo che sia direttamente hash[chiave] )
grazie
ultima cosa, ovviamente la chiave è univoca, quindi se aggiungo una nuova entry con una chiave e il num di occorrenze incrementato, quella di prima non ci sarà più?

deadlyomen17
19-05-2010, 10:27
grazie della risposta..in c# sarebbe hashtable?
dai un'occhiata qui please
http://www.sviluppo-software.info/2010/04/struttura-dati-hashtable-in-c.html
i metodi che mi hai scritto, gli equivalmenti sono Add(per put), ma non ho capito l'equivalente del get (credo che sia direttamente hash[chiave] )
grazie


capire come implementare quel semplice algoritmo in un certo linguaggio è ovviamente compito tuo, ti ricordo che non si danno mai soluzioni complete e funzionanti con tanto di codice pronto
inoltre ti basta cercare su qualche guida come usare le hashmap in c# per capire come usare la funzione di getter, è una cosa estremamente basilare.

ultima cosa, ovviamente la chiave è univoca, quindi se aggiungo una nuova entry con una chiave e il num di occorrenze incrementato, quella di prima non ci sarà più?

in alcune implementazioni di hashmap è così, per esempio in quella Java
javadoc del metodo put:
Integer java.util.HashMap.put(String key, Integer value)

Associates the specified value with the specified key in this map. If the map previously contained a mapping for the key, the old value is replaced.
ma non è detto che sia così in tutte.
per esempio in alcuni linguaggi fare questa operazione alla lettera potrebbe addirittura causare un errore, ma sarebbe banale da risolvere, basterebbe eliminare la entry e poi rimettere quella aggiornata.