Algoritmo de Kadence: subconjunto contiguo de suma más grande

⚡ Resumen inteligente

El algoritmo de Kadane encuentra la suma más grande de submatrices contiguas en tiempo lineal mediante tracCalcular un máximo acumulado en lugar de escanear cada submatriz posible. Este truco clásico de programación dinámica permite resolver problemas de bolsa, finanzas y señales.

  • 🎯 Definición del problema: Un subarreglo contiguo es una secuencia de elementos consecutivos; el objetivo es el subarreglo con la suma aritmética más alta dentro de un arreglo mixto positivo y negativo.
  • ???? Fuerza bruta: Dos bucles anidados evalúan cada índice de inicio y fin en tiempo O(N²) e imprimen la ventana ganadora usando marcadores de inicio y fin.
  • ⚡ La perspectiva de Kadane: Reiniciar la suma acumulada siempre que el elemento actual supere al acumulador, mantenerping Solo el mejor prefijo que aún pudiera convertirse en la respuesta.
  • 🧭 Ejemplo trabajado: Un breve recorrido por una matriz con valores negativos muestra cómo max_sum y current_sum evolucionan paso a paso hasta que se alcanza el máximo real.
  • 💻 Cobertura de idiomas: Ambos C++ y Python Las implementaciones del enfoque simple y del algoritmo de Kadane demuestran la transición de un tiempo O(N²) a un tiempo O(N).
  • 📊 Complejidad: El algoritmo de Kadane se ejecuta en tiempo O(N) con espacio adicional O(1), superando drásticamente el rendimiento de referencia de fuerza bruta en matrices de entrada grandes.

Submatriz contigua de suma más grande del algoritmo de Kadane

¿Cuál es la submatriz contigua de mayor suma?

Un subarreglo es una parte continua de un arreglo. Puede ser un solo elemento de una matriz o alguna fracción de la matriz. El subarreglo contiguo de suma más grande significa un subarreglo que tiene el valor de suma máximo.

Por ejemplo, consideremos el arreglo {-10, 5, 1, 6, -9, 2, -7, 3, -5}. Sus subarreglos pueden ser {-10, 5, 1, 6}, {5, 1, 6} o {2, -7, 3, -5}, y así sucesivamente. Sin embargo, {5, 1, 6, 3} no puede ser un subarreglo porque sus elementos no están en una secuencia contigua.

Subarreglo contiguo de suma más grande

Si observas, entre todos los subconjuntos, el subconjunto resaltado {5, 1, 6} tiene el valor de suma máximo:

Submatriz contigua de mayor suma resaltada

La suma del subarreglo {5, 1, 6} es 12, la suma máxima posible entre todos los subarreglos del arreglo anterior. Por lo tanto, para este arreglo, el subarreglo contiguo con la suma máxima es {5, 1, 6}.

Método sencillo para resolver el problema de la suma máxima en submatrices contiguas.

La forma sencilla de resolver este problema es utilizar dos bucles para encontrar todos los subarreglos, calcular la suma y luego encontrar su valor máximo.

Aquí se muestra el diagrama de flujo para el método sencillo de encontrar la submatriz contigua con la suma más grande. Este es un método de fuerza bruta, ya que recorremos todas las submatrices posibles.

Enfoque simple para resolver la suma más grande

Estos son los sencillos pasos para hacer esto.

Paso 1) Inicializar suma máxima con el valor entero mínimo y el conjunto begin y final a cero.

Paso 2) Deje que i y j ser índices de matriz donde j es mayor o igual que i; i marca el inicio del subconjunto y j su fin.

Paso 3) suma_actual contiene la suma acumulada. Después de cada actualización, compruebe si suma_actual es mayor que suma máxima.

Paso 4) If suma_actual es mayor, reemplazar suma máxima con ella.

Paso 5) Cuando j llega al final del array, incrementa i y reiniciar suma_actual a 0.

Paso 6) Repita hasta que i llega al final del array. suma máxima luego contiene la suma de submatrices más grande.

Apodo Code para un enfoque sencillo

function maximumSubarraySum():
    input: array
    for all possible subArray from array:
        calculate sum of each subarray
        store the maximum subArray
    return the maximum sum

C++ Implementación de un enfoque simple

#include <stdio.h>
#include <iostream>
using namespace std;
void maximumSubarraySum(int array[], int n) {
    int max_sum = -1e9;
    int begin = 0;
    int end = 0;
    for (int i = 0; i < n; i++) {
        int current_sum = 0;
        for (int j = i; j < n; j++) {
            current_sum += array[j];
            if (max_sum < current_sum) {
                max_sum = current_sum;
                begin = i;
                end = j;
            }
        }
    }
    cout << "largest sum is " << max_sum << endl;
    cout << "largest sum contiguous subarray: ";
    for (int i = begin; i <= end; i++) {
        cout << array[i] << "\t";
    }
}
int main() {
    int array[] = {-10, 5, 1, 6, -9, 2, -7, 3, -5};
    maximumSubarraySum(array, sizeof(array) / sizeof(array[0]));
}

Salida:

largest sum is 12
largest sum contiguous subarray: 5      1       6

Python Implementación de un enfoque simple

def maximumSubarraySum(numbers):
    max_sum, begin, end = -1e9, 0, 0
    for i in range(len(numbers)):
        current_sum = 0
        for j in range(i, len(numbers)):
            current_sum += numbers[j]
            if max_sum < current_sum:
                max_sum = current_sum
                begin, end = i, j
    print("largest sum is ", max_sum)
    print("largest sum contiguous subarray: ", end='')
    for i in range(begin, end + 1):
        print(numbers[i], end='\t')

numbers = [-10, 5, 1, 6, -9, 2, -7, 3, -5]
maximumSubarraySum(numbers)

Salida:

largest sum is 12
largest sum contiguous subarray: 5      1       6

Algoritmo de Kadane para encontrar la submatriz contigua de suma más grande

El algoritmo de Kadane es un método de programación dinámica que utiliza un solo bucle en lugar de dos. Maneja arreglos con números positivos y negativos, siempre que al menos un valor sea no negativo.

Solo necesitamos dos variables para encontrar la submatriz contigua con la suma más grande. Aquí está el diagrama de flujo:

Algoritmo de Kadane para encontrar la suma más grande

Estos son los pasos para el algoritmo de Kadane:

Paso 1) Crea dos variables, suma_actual y suma máxima.

suma_actual conserva la suma máxima que termina en un índice de matriz específico, mientras que suma máxima Almacena el mayor valor de suma observado hasta el momento.

Paso 2) Agregue cada elemento de la matriz a suma_actualA continuación, compruebe las dos condiciones siguientes:

  • If suma_actual es menor que el elemento actual, entonces suma_actual se convierte en el elemento actual.
  • If suma máxima es menor que suma_actual, luego suma máxima se convierte en suma_actual.

Paso 3) Después de repetir el paso anterior para todo el conjunto, suma máxima contiene la submatriz contigua de mayor suma.

Ejemplo del algoritmo de Kadane

Demostramos el algoritmo de Kadane en un arreglo pequeño y explicamos cada paso para encontrar el subarreglo contiguo con la suma más grande.

Supongamos que el arreglo dado es como el siguiente:

Ejemplo del algoritmo de Kadane

Estos son los pasos del algoritmo de Kadane:

Paso 1) Crea dos variables, suma_actual y suma máxima. Asignar INT_MIN a suma máxima y cero a suma_actualAquí, INT_MIN representa el valor entero mínimo.

Paso 2) En el índice 0, el valor es 4. Entonces, suma_actual = 0 + 4 = 4. Dado que suma_actual Es mas grande que suma máxima, suma máxima se convierte en 4.

Ejemplo del paso 2 del algoritmo de Kadane

Paso 3) En el índice 1, el valor es -2. Entonces, suma_actual = 4 + (-2) = 2.

Esta vez suma_actual es menor que suma máxima. Como resultado, el valor de suma máxima no está actualizado.

Ejemplo del paso 3 del algoritmo de Kadane

Paso 4) El siguiente valor es 1. Sumándolo a suma_actual da 3. Dado que suma máxima (4) sigue siendo mayor que suma_actual, suma máxima no está actualizado.

Ejemplo del paso 4 del algoritmo de Kadane

Paso 5) En el índice 3, el valor es 3. Incrementando suma_actual por 3 da suma_actual = 6.

Ejemplo del paso 5 del algoritmo de Kadane

En este caso, suma máxima es más pequeño que suma_actual, asi que suma máxima se actualiza con el valor de suma_actual.

Paso 6) Para el último elemento del array, tenemos -1. Sumándolo a suma_actual da 5, que es menor que suma máxima. Asi que, suma máxima quedan 6.

Ejemplo del paso 6 del algoritmo de Kadane

Al llegar al final del array, el algoritmo termina aquí. Ahora, suma máxima contiene la suma máxima, que es 6. El subconjunto es {4, -2, 1, 3}.

Apodo Code para el algoritmo de Kadane

function KadaneAlgorithm():
    input: array
    maximum_sum, current_sum = 0
    for each element in array:
        add the element with current_sum
        if current_sum is greater than the maximum_sum
            then maximum_sum = current_sum
        if current_sum is less than the element
            then current_sum = element
    return the value of maximum_sum

C++ Implementación del algoritmo de Kadane.

#include <iostream>
using namespace std;
void kadane(int array[], int n) {
    int current_sum = 0;
    int max_sum = -1e9;
    // -1e9 means -1,000,000,000
    for (int i = 0; i < n; i++) {
        current_sum += array[i];
        if (max_sum < current_sum) {
            max_sum = current_sum;
        }
        if (current_sum < array[i]) {
            current_sum = array[i];
        }
    }
    cout << "largest sum is " << max_sum << endl;
}
int main() {
    int array[] = {-10, 5, 1, 6, -9, 2, -7, 3, -5};
    kadane(array, sizeof(array) / sizeof(array[0]));
}

Salida:

largest sum is 12

Python Implementación del algoritmo de Kadane.

def kadane(numbers):
    current_sum = 0
    max_sum = -1e9
    for i in range(len(numbers)):
        current_sum += numbers[i]
        if max_sum < current_sum:
            max_sum = current_sum
        if current_sum < numbers[i]:
            current_sum = numbers[i]
    print("largest sum is ", max_sum)

kadane([-10, 5, 1, 6, -9, 2, -7, 3, -5])

Salida:

largest sum is 12

Análisis de complejidad para el subarreglo contiguo de suma más grande

El enfoque simple utiliza dos bucles para calcular la suma de cada submatriz posible y localizar la mayor. Es un enfoque de fuerza bruta; cada bucle se ejecuta hasta el final de la matriz. matrizdando O(N²) en las transacciones.

El algoritmo de Kadane utiliza un solo bucle, lo que resulta en un tiempo de O(N) y un espacio adicional de O(1). En un arreglo de 100 elementos, el método simple realiza 100 × 100 = 10 000 operaciones, mientras que el de Kadane realiza solo 100, lo que supone una mejora drástica en la velocidad para entradas grandes.

Preguntas Frecuentes

El algoritmo de Kadane sustenta la ingeniería de características de IA para datos de series temporales, detección de ventanas de anomalías y distribución de recompensas.ping en el aprendizaje por refuerzo, ayudaping Los modelos detectan el intervalo de suma positiva más fuerte en las señales ruidosas.

Sí. GitHub Copilot y GPT generan de forma fiable el algoritmo de Kadane en Python, C++, y Java, incluyendo variantes que devuelven los índices de inicio y fin del subconjunto ganador.

El algoritmo de Kadane se ejecuta en tiempo O(N) y espacio auxiliar O(1) porque realiza una sola pasada. tracrey solo una suma acumulada y el mejor valor hasta el momento.

Inicializa max_sum con el primer elemento o con menos infinito en lugar de cero. El algoritmo devuelve entonces el elemento menos negativo, que es la respuesta correcta.

Entre sus usos más comunes se encuentran las ventanas de ganancias de compraventa de acciones, la suma de bordes de imágenes, los intervalos de puntuación genómica y el análisis de riesgos financieros, donde la mejor ventana de retorno contigua es de vital importancia.

Tracka índice de inicio temporal cada vez que current_sum se restablece al elemento actual. Cuando max_sum se actualiza, captura los índices de inicio y fin para que el subconjunto de respuesta pueda dividirse al final.

El método de divide y vencerás resuelve el problema del subconjunto máximo en O(N log N) combinando las sumas de la izquierda, la derecha y los cruces. El algoritmo de Kadane es más rápido, con un tiempo de ejecución de O(N), y más fácil de programar.

Sí. El ejemplo de Kadane es un ejemplo canónico de programación dinámica con estado O(1), donde cada nuevo máximo que termina en el índice i depende del máximo que termina en el índice i menos uno más el elemento actual.

Resumir este post con: