Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    cicli innestati in una mappa

    Buonasera. Ho una mappa (chiave, valore) in cui dovrei trovare l'intervallo delle chiavi i cui valori sommati sono massimi (alcuni valori della mappa sono negativi). Ho provato con questo doppio ciclo ma non mi viene fuori il valore corretto seppure il codice mi pare giusto. Dove sbaglio???

    int time_def1 = 0;
    int time_def2 = 0;
    double dev_defin = 0;


    for (int i = 0; i < map_deviation.size(); i++) {
    int time_1 = indici.get(i);
    double somma = map_deviation.get(time_1);
    for (int j = i+1; j < map_deviation.size(); j++) {
    int time_2 = indici.get(j);
    double somma1 = somma + map_deviation.get(time_2);
    if (somma1 > somma){
    dev_defin = somma1;
    time_def1 = time_1;
    time_def2 = time_2;
    }
    somma = somma1;
    }
    }

    System.out.println(time_def1 + ", " + time_def2 + ", " + dev_defin);

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da flyfly2301 Visualizza il messaggio
    Dove sbaglio???

    codice:
    if (somma1 > somma){
    Il problema è qui: stai confrontando la sommatoria di quel intervallo rispetto a quella appena precedente.
    Il confronto va fatto rispetto dev_defin
    Ultima modifica di andbin; 14-11-2015 a 08:10
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Comunque se è ordinata il problema si può risolvere in O(n):
    codice:
      int seq[] = {1, -3, 5, 7, -1, 2 }; //out 2-5 13
      /*int seq[] = {-1, -3, -5, -7, -1, -2 }; 
        //out -1--1 0
        //nel caso si voglia lo stesso l'intervallo basta trovare il valore massimo 0-0 -1 o 4-4 -1
        //trovare il massimo è O(n) e quindi non cambia la complessità, inoltre puoi farlo all'interno del ciclo
      //*/
      int curr = 0, max = 0, start = -1, curr_start = 0, stop = -1;
      for(int i = 0; i < seq.length; ++i) {
       curr += seq[i];
       if(curr < 0) {
        curr_start = i+1;
        curr = 0;
       }
       else if(curr > max) {
        
        start = curr_start;
        stop = i;
        max = curr;
       }
      }
      System.out.println(""+start+"-"+stop+" "+max);
    Edit: ah, il se è ordinata l'ho dato per scontato, altrimenti ovviamente sarebbe la somma dei soli valori positivi e quindi sarebbe O(n) comunque. (In questo caso più che un intervallo di indici sarebbe un set(?))

    Edit1: è (curr >= max) altrimenti si ottiene quella massima ma non necessariamente più lunga (ovvero si possono scartare gli 0)
    Ultima modifica di Scara95; 14-11-2015 a 10:58
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  4. #4
    Risolto grazie all'accorgimento di andbin, bastava modificare somma con dev_defin. Grazie mille a tutti.

  5. #5
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Quote Originariamente inviata da flyfly2301 Visualizza il messaggio
    Risolto grazie all'accorgimento di andbin, bastava modificare somma con dev_defin. Grazie mille a tutti.
    Resta comunque un O(n^2), su input piccoli non cambia molto ma se pensi di dover considerare input di una certa dimensione la differenza diventa considerevole.

    Ciao, comunque
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

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.