[risolto]Gestione di un array di oggetti

di il
13 risposte

[risolto]Gestione di un array di oggetti

Buongiorno, dovrei scrivere un metodo public static Elemento [] abc (Elemento [] a) che preso in input un array di oggetti ,restituisce un nuovo array di oggetti in cui non  sono presenti due elementi aventi lo stesso campo valore.

Come fareste voi senza usare ad esempio Hashmap e con tempo di esecuzione peggiore O(n log n)?
Non ho proprio idea da dove iniziare.

13 Risposte

  • Re: [risolto]Gestione di un array di oggetti

    SickAnon ha scritto:


    preso in input un array di oggetti ,restituisce un nuovo array di oggetti in cui non  sono presenti due elementi aventi lo stesso campo valore.
    Solo per chiarire: esattamente due o almeno due?
  • Re: [risolto]Gestione di un array di oggetti

    Non deve avere due o più elementi con il campo Valore uguale. Quindi non devono esserci elementi ripetuti.
  • Re: [risolto]Gestione di un array di oggetti

    Sicuramente hai sbagliato qualcosa nella descrizione, altrimenti la soluzione è banale ed è O(1): fai un nuovo array con un un unico elemento - il primo che trovi nel vecchio array.

    Presumo che la traccia imponga la condizione: per ogni double x per cui esista un Elemento A tale che A.valore = x nel vecchio array, esiste ed è unico un B nel nuovo array tale che B.valore = x

    In questo caso, devi prima fare un sort dell'array vecchio su Elemento.valore, dopodiché fai un for e copi ogni Elemento nell'array nuovo solo se il valore dell'elemento è strettamente maggiore del precedente.

    Se scegli come algoritmo di sort uno che abbia worst case O(n * log n), il tuo metodo avrà pure worst case O(n * log n + n) = O(n * (log n + 1)) = O(n * log n)

    Per la scelta del sort sta a te:
    https://en.wikipedia.org/wiki/Sorting_algorithm#Comparison_sorts
  • Re: [risolto]Gestione di un array di oggetti

    Hai ragione , infatti il testo non era completo ,sarebbe:
    il metodo prende in input un array di Elemento , e restituisce un nuovo array di Elemento in cui non  sono presenti 2 elementi con lo stesso campo Valore. Se nell’array a erano presenti  2 o più elementi con lo stesso campo valore, nel nuovo array deve essere presente un  solo elemento con quel campo valore, la cui molteplicità è pari alla somma delle molteplicità degli elementi che in a avevano lo stesso campo valore.   Il metodo deve avere tempo di esecuzione nel caso peggiore O(n log n).

    La parte in cui elimino gli elementi ripetuti l'ho fatta, ora non so come memorizzare il numero di volte in cui un singolo elemento è ripetuto per inserirlo nel campo Molteplicità.
  • Re: [risolto]Gestione di un array di oggetti

    Sì ma non basta che tu l'abbia già fatto, devi averlo fatto nel modo giusto: c'è un vincolo espresso come numero massimo di comparazioni che puoi fare nel caso peggiore.

    O scegli uno degli algoritmi di sort di cui si conosce vita morte e miracoli, e poi aggiungi il for che ti ho detto che ha n comparazioni fisse (rispetto a quanto ti ho detto, in caso di elementi uguali incrementi la molteplicità invece di aggiungere un nuovo elemento), oppure devi dimostrare che il tuo algoritmo abbia un worst case O(n * log n), e non è detto che sia semplice.

    Poi magari hai già fatto tutto esattamente, per carità
  • Re: [risolto]Gestione di un array di oggetti

    Weierstrass ha scritto:


    Sì ma non basta che tu l'abbia già fatto, devi averlo fatto nel modo giusto: c'è un vincolo espresso come numero massimo di comparazioni che puoi fare nel caso peggiore.

    O scegli uno degli algoritmi di sort di cui si conosce vita morte e miracoli, e poi aggiungi il for che ti ho detto che ha n comparazioni fisse (rispetto a quanto ti ho detto, in caso di elementi uguali incrementi la molteplicità invece di aggiungere un nuovo elemento), oppure devi dimostrare che il tuo algoritmo abbia un worst case O(n * log n), e non è detto che sia semplice.

    Poi magari hai già fatto tutto esattamente, per carità
    L'ho fatto in questa maniera perché non riesco a capire come incrementare la molteplicità in caso siano uguali i due elementi.

    public static Elem[] abc (Elem[] a){

    double[] sup = new double[a.length];
    for(int i=0;i<a.length;i++) {
    sup=a.valore;
    }
    mergeSort(sup);

    int doppioni=0;
    for(int i=0;i<sup.length-1;i++) {
    if(sup==sup[i+1]) {
    doppioni++;
    }
    }

    Elem[] ele = new Elem[sup.length-doppioni];
    int j=0;
    for(int i =0;i<sup.length-1;i++) {
    if(sup<sup[i+1]) {
    ele[j]= new Elem(sup,0);
    j++;
    }
    ele[j]=new Elem(sup[sup.length-1],0);
    }

    for(int i=0;i<ele.length;i++) {
    ele.molteplicita=molt(sup,ele.valore);
    }
    return ele;
    }

    static int molt(double[]a,double b) {
    int ris=0;
    for(int i=0;i<a.length;i++) {
    if(b==a) {
    ris++;
    }
    }
    return ris;

    }
  • Re: [risolto]Gestione di un array di oggetti

    SickAnon ha scritto:


    L'ho fatto in questa maniera perché non riesco a capire come incrementare la molteplicità in caso siano uguali i due elementi.

    public static Elem[] abc (Elem[] a){

    double[] sup = new double[a.length];
    for(int i=0;i<a.length;i++) {
    sup=a.valore;
    }
    mergeSort(sup);
    Già solo questo non ha granché senso. Innanzitutto

    sup=a.valore;

    non ha senso. Non puoi assegnare un valore numerico ad una variabile array.

    Poi comunque se vuoi seguire la strada dell'ordinamento iniziale con algoritmo a caso peggiore O(n log n), come appunto il Merge Sort, non devi ordinare un array di double! Devi ordinare un array Elem[] usando il valore come chiave di confronto.
  • Re: [risolto]Gestione di un array di oggetti

    andbin ha scritto:


    SickAnon ha scritto:


    L'ho fatto in questa maniera perché non riesco a capire come incrementare la molteplicità in caso siano uguali i due elementi.

    public static Elem[] abc (Elem[] a){

    double[] sup = new double[a.length];
    for(int i=0;i<a.length;i++) {
    sup=a.valore;
    }
    mergeSort(sup);
    Già solo questo non ha granché senso. Innanzitutto

    sup=a.valore;

    non ha senso. Non puoi assegnare un valore numerico ad una variabile array.

    Poi comunque se vuoi seguire la strada dell'ordinamento iniziale con algoritmo a caso peggiore O(n log n), come appunto il Merge Sort, non devi ordinare un array di double! Devi ordinare un array Elem[] usando il valore come chiave di confronto.
    Per quanto riguarda sup=a.valore sarebbe sup i=a i .valore ma copiando il codice sono state troncate tutte le i.

    Comunque volevo ordinare l'array di Elem[] ma il mergesort mi da errore.

    static void mergeSort2(Elem[] a) {
    Elem[] arr = new Elem[a.length];
    mergeSort2(a, 0, a.length - 1, arr);
    }


    static void mergeSort2(Elem[] a, int p, int r, Elem[] arr) {
    if (p < r) {
    int q = (p + r) / 2;
    mergeSort2(a, p, q, arr);
    mergeSort2(a, q + 1, r, arr);
    merge2(a, p, q, r, arr);
    }
    }


    static void merge2(Elem[] a, int p, int q, int r, Elem[] arr) {
    for (int i = p; i <= r; i++) {
    arr.valore = a.valore;
    }
    int sin = p;
    int des = q + 1;
    for (int i=p; i<=r;i++) {
    if (sin<=q && (des>r || arr[sin].valore<=arr[des].valore)) {
    a.valore=arr[sin].valore;
    sin++;
    } else {
    a.valore = arr[des].valore;
    des++;
    }
    }



    }
  • Re: [risolto]Gestione di un array di oggetti

    SickAnon ha scritto:


    Per quanto riguarda sup=a.valore sarebbe sup i=a i .valore ma copiando il codice sono state troncate tutte le i.
    Sì, ok. Probabilmente avevi inteso sup[i]=a.valore; che è corretto.

    SickAnon ha scritto:


    Comunque volevo ordinare l'array di Elem[] ma il mergesort mi da errore.
    Non ho molto tempo adesso per analizzare tutto il tuo codice del merge sort ma un appunto posso farlo: quando fai gli spostamenti, NON spostare il valore. Devi spostare gli oggetti Elem in sé. L'accesso (e solo in lettura!) al valore deve essere solamente per fare da "chiave" di confronto e basta.
  • Re: [risolto]Gestione di un array di oggetti

    Hai ragione grazie mille ho risolto per quanto riguarda il mergesort
  • Re: [risolto]Gestione di un array di oggetti

    E quindi a che punti sei arrivato?

    Usa i tag CODE altrimenti non si capisce nulla
  • Re: [risolto]Gestione di un array di oggetti

    Weierstrass ha scritto:


    E quindi a che punti sei arrivato?

    Usa i tag CODE altrimenti non si capisce nulla
    Il metodo che ho scritto ritorna quello che la consegna richiede ma sono sicuro che si potrebbe fare di meglio, in particolare il metodo Molt che uso alla fine del codice per trovare la molteplicità degli elementi può essere fatto diversamente senza ricorsione.
    public static Elem[] abc (Elem[] a){
    		mergeSort2(a);
    		
    		int doppioni=0;
    		for(int i=0;i<a.length-1;i++) {
    			if(a[i].valore==a[i+1].valore) {
    			doppioni++;
    			}
    		}
    		
    		Elem[] ele = new Elem[a.length-doppioni];
    		int j=0;
    		for(int i =0;i<a.length-1;i++) {
    			if(a[i].valore<a[i+1].valore) {
    			ele[j]= new Elem(a[i].valore,0);
    			j++;
    			}
    		ele[j]=new Elem(a[a.length-1].valore,0);
    		}
    		
    		for(int i=0;i<ele.length;i++) {
    		ele[i].molteplicita=molt(a,ele[i].valore);
    		}
    		return ele;
    	}
    	static int molt(Elem[]a,double b) {
    		int ris=0;
    		for(int i=0;i<a.length;i++) {
    			if(b==a[i].valore) {
    			ris++;
    			}
    	}
    		return ris;
    	}
    

    Ho cercato di fare come mi avevi detto tu cioè se confrontando due elementi l'elemento successivo è maggiore allora lo inserisco , se sono uguali incremento la molteplicità , ma non riesco a farlo.
  • Re: [risolto]Gestione di un array di oggetti

    La tua soluzione è O(n^2) nel worst case, non va bene.

    Dopo il sort devi fare un ciclo for solo. Ti crei un elemento temporaneo = elemento(i). Se elemento [i+1].valore > elemento(i).valore, inserisci l'elemento temporaneo nel nuovo array e ricominci con un elemento nuovo, altrimenti sommi il campo molteplicità di tutti gli elementi col valore uguale e vai avanti.
Devi accedere o registrarti per scrivere nel forum
13 risposte