Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    347

    Trovare elemento più frequente in un array

    ciao, mi è capitato questo esercizio che chiede appunto di scrivere un metodo che trovi l'elemento più frequente in un array, allora ho provato così:
    codice:
     
    class OccorrenzaArray{
    	public static int occorrenza(int a[]){
    		int[] oc = new int[a.length];
    		for(int p=0; p<a.length; p++){
    			for(int i=0; i<a.length; i++){
    				if(a[p] == a[i]){
    					oc[p] = oc[p] + 1;
    				}
    			}
    		}
    		int max = oc[0];
    		for(int j=1; j<oc.length; j++){
    			if(oc[j]>oc[j-1])
    				max = j;
    		}
    		return a[max];
    	}
    }
    però il codice mi sembra un po pesante... come avreste fatto voi?
    (non sto chiedendo di farmi l'esercizio eh! l'ho fatto gia!)

  2. #2

    Re: Trovare elemento più frequente in un array

    Originariamente inviato da John360
    però il codice mi sembra un po pesante... come avreste fatto voi?
    (non sto chiedendo di farmi l'esercizio eh! l'ho fatto gia!)
    Così:
    codice:
        public static int moda(int A[]){
    	HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();    	
        	int moda = 0;
        	
        	for(int e : A){
        		map.put(e, (map.get(e) == null ? 1 : map.get(e) + 1 ) );
        		
        		if( map.get(moda) == null || map.get(e) > map.get(moda) )
        			moda = map.get(e);
        	}
        	
        	return moda;
        }
    Però dovresti definire un qualcosa di più generico, ad esempio:
    codice:
    public static Object moda(Object A[])
    oppure ricorrendo all'uso dei Generics.

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    347
    tutte cose che non abbiamo ancora fatto(università) XD

  4. #4
    Originariamente inviato da John360
    tutte cose che non abbiamo ancora fatto(università) XD
    Di sicuro puoi migliorare il tuo algoritmo, ad esempio tenendo in memoria la massima frequenza e confrontarla con l'i-esima frequenza calcolata.

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    347
    cioè dove potrei inserire questo? devo cancellare direttamente il vettore dove ho memorizzato le occorrenze di ogni numero?

  6. #6
    Originariamente inviato da John360
    devo cancellare direttamente il vettore dove ho memorizzato le occorrenze di ogni numero?
    Si, esatto.

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    347
    non ho capito bene come dovrei fare però... forse così?:
    codice:
     
    int max=0;
    int ind=0;
    for(int i=0; i<a.length; i++){
        int maxp=0;
        for(int j=0; j<a.length; j++){
            if(a[i] == a[j])
                maxp++;
        }
        if(maxp>max){
        max = maxp;
        ind=i;
    }
    return ind;
    premetto che l'ho scritto al volo questo senza provarlo... anche perchè probabilmente ho scritto ca***te XD

  8. #8
    Originariamente inviato da John360
    non ho capito bene come dovrei fare però... forse così?:
    codice:
     
    int max=0;
    int ind=0;
    for(int i=0; i<a.length; i++){
        int maxp=0;
        for(int j=0; j<a.length; j++){
            if(a[i] == a[j])
                maxp++;
        }
        if(maxp>max){
        max = maxp;
        ind=i;
    }
    return ind;
    premetto che l'ho scritto al volo questo senza provarlo... anche perchè probabilmente ho scritto ca***te XD
    Si, può anche andare. Sistema le parentesi.

  9. #9
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    347
    bene, un'ultima richiesta: mi spiegheresti gentilmente la soluzione che avevi scritto all'inizio?(ricordo che non ho studiato niente del genere... magari con parole semplici)
    grazie

  10. #10
    Originariamente inviato da John360
    bene, un'ultima richiesta: mi spiegheresti gentilmente la soluzione che avevi scritto all'inizio?(ricordo che non ho studiato niente del genere... magari con parole semplici)
    grazie
    HashMap è una implementazione tipica del dato astratto Dizionario (in java, Map) che concettualmente è un sottoinsieme del prodotto cartesiano di due insiemi di entità.
    Quindi, l'istanza di HashMap contiene le coppie (chiave, valore), entrambi di tipo Integer, e nello specifico le chiavi sono gli elementi nell'array (preso come argomento) e i valori sono le relative frequenze.

    L'algoritmo:
    scorre una sola volta l'array e aggiorna la frequenza associata alla chiave dell'i-esimo elemento, quindi controlla se tale frequenza è maggiore di quella massima.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.