2011-08-29 15 views
8

Tengo la siguiente implementación del algoritmo de Kadane en java. Básicamente, es para encontrar la suma máxima de subcampos contiguos.algoritmo kadane en java

String[] numbers = string.split(","); 
       int max_so_far = 0; 
       int max_ending_here = 0; 
       for (int i = 0; i < numbers.length-1;i++){ 
        max_ending_here = max_ending_here + Integer.parseInt(numbers[i]); 
        if (max_ending_here < 0) 
         max_ending_here = 0; 
        if (max_so_far < max_ending_here) 
          max_so_far = max_ending_here; 
       } 
       System.out.println(max_so_far); 

Sin embargo, esto no funciona si hay una combinación de un número negativo y positivo en una matriz, por ejemplo el siguiente:

2,3,-2,-1,10 

que debe devolver un 12 como máximo. A partir de ahora, devuelve 5

+3

¿Cuál es la pregunta aquí? ¿Has probado a depurar esto? –

+2

¿qué valor le da en este momento? – luketorjussen

+0

O i <= numbers.length-1 habría hecho un mejor entendimiento de la longitud. – Kunalxigxag

Respuesta

11

La implementación del algoritmo se ve bien, pero su condicional de condicional i < numbers.length-1 no: se detiene solo 1 corto del final de la matriz. i < numbers.length debe hacerlo :-)

+0

sí, es un error tan estúpido ... ¡gracias! Ocurre de vez en cuando – aherlambang

+7

Es por eso que para cada ciclo es tan bueno. Usted evita tales trampas. –

4

esto funciona para mí:

String string = "2,3,-2,-1,10"; 
    String[] numbers = string.split(","); 
    int max_so_far = 0; 
    int max_ending_here = 0; 
    for (String num : numbers) { 
     int x = Integer.parseInt(num); 
     max_ending_here = Math.max(0, max_ending_here + x); 
     max_so_far = Math.max(max_so_far, max_ending_here); 
    } 
    System.out.println(max_so_far); 
1

En cuanto a la respuesta anterior de Michał Šrajer:

la línea # 7: max_ending_here = Math.max (0, x + max_ending_here);

debería ser:

max_ending_here = Math.max (x, max_ending_here + x);

... según el algoritmo kadane como se define here

0

demasiado tarde, pero si alguien lo necesita en el futuro.

public static void kadaneAlgo(int[][] array) 
    for(int i = 1; i < array.length; i++){ 
      int max_value_index_i = numberOrSum(array[i], past); 
      if(max_value_index_i > sum){ 
       sum = max_value_index_i; 
      } 
      past = max_value_index_i; 

     } 
     System.out.println("Max sum from a contiguous sub array is : " + sum); 
    } 

    public static int numberOrSum(int number, int past){ 
     return Math.max(number, number+past); 
    }