Somma massima array

di il
11 risposte

Somma massima array

Ciao ragazzi e grazie delle risposte negli altri topic.
Tanto per cambiare ho un altro problema che non riesco a risolvere
Scrivere un metodo
static int[] sommaMassima (int[] a)
in Java, che preso come parametro un array di numeri interi, restituisce un sottoarray di a (di elementi consecutivi) avente somma massima in a.
Ad esempio, se a = {-10, 35, -20, 50, -30, -14, 2, 19} il metodo deve restituire il sottoarray {35, -20, 50} che è quello di somma massima.

Non so proprio come strutturare la risoluzione ho cercato di basarmi su un altro metodo che ti trova la somma massima per farmi una idea ma niente. Per somma massima intendo questo
Dite che questo codice potrebbe aiutarmi? Poi avrei anche una domanda, perchè in questo codice ci sono 2 cicli for? Perchè c'è anche il ciclo j?

public class esempio {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
}
static int sommaArrayMax(int[]a){
	int sommaMax = a[0];
	for ( int i=0; i<a.length; i++){
		int somma=0;
		for (int j=i; j<a.length; j++){
			somma += a[j];
			if (somma > sommaMax) {sommaMax = somma;}
		}
	} return sommaMax;
}
}

11 Risposte

  • Re: Somma massima array

    Rados ha scritto:


    Non so proprio come strutturare la risoluzione ho cercato di basarmi su un altro metodo che ti trova la somma massima per farmi una idea ma niente. Per somma massima intendo questo
    Dite che questo codice potrebbe aiutarmi?
    Indizio: in sommaArrayMax, se somma > sommaMax giustamente viene fatto sommaMax = somma ma in quel momento hai anche 2 informazioni molto utili, gli indici i e j che sono gli estremi del sotto-array che ha portato ad una nuova somma "max".
    Chiaramente si deve andare avanti, il max assoluto lo sai solo alla fine di tutto. E andando avanti potrai trovare un'altra somma max e .... altrettanti i/j.

    Rados ha scritto:


    Poi avrei anche una domanda, perchè in questo codice ci sono 2 cicli for? Perchè c'è anche il ciclo j?
    Perché deve "provare" con tutti i sotto-array possibili.
  • Re: Somma massima array

    Se ho capito bene mi stai dicendo che dovrei mettere gli ultimi i e j in delle variabili temporanee?
    tipo
    if (somma > sommaMax) {sommaMax = somma; num1=a; num2=a[j];}
  • Re: Somma massima array

    Rados ha scritto:


    Se ho capito bene mi stai dicendo che dovrei mettere gli ultimi i e j in delle variabili temporanee?
    tipo
    if (somma > sommaMax) {sommaMax = somma; num1=a; num2=a[j];}

    Devi "ricordare" gli indici estremi, non i valori a quei indici!
  • Re: Somma massima array

    If (somma > sommaMax) {sommaMax = somma; num1=i; num2=j;}
    Cosi allora? E poi
    Per indici estremi intendi quando i=0 j arriva fino a j=7 (j=0,j=1,j=2ecc..) poi i=1 (j=1,j=2..) ??
  • Re: Somma massima array

    Rados ha scritto:


    if (somma > sommaMax) {sommaMax = somma; num1=i; num2=j;}
    Cosi allora?
    Sì, appunto gli indici.

    Rados ha scritto:


    E poi
    Indizio: cosa puoi fare con i due indici che rappresentano gli estremi (inclusi) del sotto-array che ha prodotto la somma max finale?

    Con {-10, 35, -20, 50, -30, -14, 2, 19}

    Alla fine dei cicli avrai che num1 è 1 (indice di 35) e num2 è 3 (indice di 50). E .... secondo te cosa ci puoi fare? Quanto è lungo il sotto-array? E con la lunghezza cosa ci puoi fare?
  • Re: Somma massima array

    AAAH ecco, è che non ero sicuro che alla fine di tutto il ciclo si sarebbero salvati gli indici degli estremi che mi servono! Devo ancora entrare bene nel meccanismo del for, molte volte mi aiuto stampando gli indici hai qualche consiglio su come allenarmi per capirlo bene?

    Tornando al problema

    per calcolare la distanza in generale tra num1 e num2 quindi
    num2-num1+1
    int[] ris = new int[num2-num1+1]
    Ora per riempirlo devo far scorrere a con un for che va da num1 a num2. Va bene così?
    for (int i=num1; i<=num2; i++){
    for (int j=0; j<ris.length; j++){
    a[j]=a;
    }
    }
  • Re: Somma massima array

    Rados ha scritto:


    AAAH ecco, è che non ero sicuro che alla fine di tutto il ciclo si sarebbero salvati gli indici degli estremi che mi servono!
    Sì, è così. Verificato che la somma del sotto-array {35, -20, 50} è la maggiore in quel momento, se successivamente non vengono trovati altri sotto-array con somma ancora maggiore (ed è così nel tuo array di esempio), chiaramente restano quei valori sommaMax/num1/num2 relativi a {35, -20, 50}.

    Rados ha scritto:


    Devo ancora entrare bene nel meccanismo del for, molte volte mi aiuto stampando gli indici hai qualche consiglio su come allenarmi per capirlo bene?
    Tanta esercitazione!

    Rados ha scritto:


    per calcolare la distanza in generale tra num1 e num2 quindi
    num2-num1+1
    Sì.

    Rados ha scritto:


    for (int i=num1; i<=num2; i++){
    for (int j=0; j<ris.length; j++){
    a[j]=a;
    }
    }

    NO! Serve un solo ciclo con un "i" che parte da 0 per i<lunghezzaSottoarray (quello che hai calcolato poco fa). Quindi "i" è l'indice nel nuovo array piccolo e num1+i è l'indice nell'array originale da cui prendere il sotto-array.

    Come vedi basta solo .... ragionamento.
  • Re: Somma massima array

    Ecco qua, verificare se funziona è una noia però, perchè se faccio direttamente stampa lui mi da l'indirizzo. Devo ancora capire come si fa
    
    public class esempio {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    }
    static int[] sommaArrayMax(int[]a){
    	int sommaMax = a[0];
    	int num1=0;
    	int num2=0;
    	for ( int i=0; i<a.length; i++){
    		int somma=0;
    		for (int j=i; j<a.length; j++){
    			somma += a[j];
    			if (somma > sommaMax) {sommaMax = somma; num1=i; num2=j;}
        }
    	}
    	int[] r = new int[num2-num1+1];
    			for (int i=0; i<r.length; i++){
    				r[i]=a[num1+i];
    			}
        return r;
        }  
        }
    
  • Re: Somma massima array

    Rados ha scritto:


    Ecco qua
    Tecnicamente corretto! Però cerca di scrivere il codice ben spaziato/indentato (ad esempio non mettere if e corpo tutto su una riga). Perché così non è il massimo della leggibilità.

    Rados ha scritto:


    perchè se faccio direttamente stampa lui mi da l'indirizzo. Devo ancora capire come si fa
    Gli array non ridefiniscono il toString(), resta quello ereditato da Object che fornisce quella forma decisamente poco utile.
    O fai un ciclo for e stampi tu i singoli elementi, oppure sfrutti il metodo toString statico di java.util.Arrays, che fornisce una rappresentazione in stringa di un array.
  • Re: Somma massima array

    andbin ha scritto:


    Tecnicamente corretto! Però cerca di scrivere il codice ben spaziato/indentato (ad esempio non mettere if e corpo tutto su una riga). Perché così non è il massimo della leggibilità.
    Ok

    andbin ha scritto:


    Gli array non ridefiniscono il toString(), resta quello ereditato da Object che fornisce quella forma decisamente poco utile.
    O fai un ciclo for e stampi tu i singoli elementi, oppure sfrutti il metodo toString statico di java.util.Arrays, che fornisce una rappresentazione in stringa di un array.
    Il metodo toString non lo conosco, dovrei iniziare col for.
    Io sono abituato a fare cosi per ora, devo provare se mi funziona in questo modo
    EDIT; allora devo richiamare il metodo stampa nel metodo somma

    
    public static void main(String[] args) {
    int[] esempio = {-10, 35, -20, 50, -30, -14, 2, 19}
    sommaArrayMax(esempio);
    stampaArray(esempio);
    }
    static void stampaArray (int[] a) {
    	System.out.print("{");
    	for (int i=0;i<a.length;i++) {
    		System.out.print(a[i]);
    		if (i<a.length-1) {
    		    System.out.print(", ");
    		}
    	}
    	System.out.println("}");
    }
    
  • Re: Somma massima array

    Rados ha scritto:


    Il metodo toString non lo conosco, dovrei iniziare col for.
    Ok, comunque ti basta guardare la documentazione javadoc:
    https://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#toString-java.lang.Object:A-
    Alla fin fine è un semplice metodo di "utilità" fornito dal framework standard.

    Rados ha scritto:


    Io sono abituato a fare cosi per ora, devo provare se mi funziona in questo modo
    stampaArray è ok

    Rados ha scritto:


    allora devo richiamare il metodo stampa nel metodo somma
    No, nel main invochi sommaArrayMax che ti restituisce il sotto-array. Quindi passa questo a stampaArray.
Devi accedere o registrarti per scrivere nel forum
11 risposte