Algoritmo de Kadence: Subarranjo Contíguo de Maior Soma

⚡ Resumo Inteligente

O algoritmo de Kadane encontra a maior soma de submatriz contígua em tempo linear por tracEm vez de analisar todas as submatriz possíveis, o rei usa um máximo contínuo. Esse truque clássico de programação dinâmica é fundamental para problemas de ações, finanças e sinais.

  • 🎯 Definição de problema: Uma submatriz contígua é uma sequência de elementos consecutivos; o objetivo é encontrar a submatriz com a maior soma aritmética dentro de uma matriz mista, com elementos positivos e negativos.
  • ???? Força Bruta: Dois laços aninhados avaliam cada índice de início e fim em tempo O(N²) e imprimem a janela vencedora usando marcadores de início e fim.
  • A visão de Kadane: Reinicie a soma acumulada sempre que o elemento atual superar o acumulador, continueping apenas o melhor prefixo que ainda poderia se transformar na resposta.
  • 🧭 Exemplo prático: Uma breve análise de um array com valores negativos mostra como max_sum e current_sum evoluem passo a passo até que o valor máximo verdadeiro seja encontrado.
  • 💻 Cobertura de idiomas: Ambos C++ e Python Implementações da abordagem simples e do Algoritmo de Kadane demonstram a transição de tempo O(N²) para O(N).
  • 📊 Complexidade: O algoritmo de Kadane é executado em tempo O(N) com espaço extra O(1), superando drasticamente a linha de base de força bruta em grandes matrizes de entrada.

Algoritmo de Kadane: Maior Soma de Submatriz Contígua

Qual é a maior soma de submatriz contígua?

Um subarray é uma parte contínua de um array. Pode ser um único elemento de uma matriz ou alguma fração da matriz. A submatriz contígua de maior soma significa uma submatriz que possui o valor de soma máximo.

Por exemplo, considere o array {-10, 5, 1, 6, -9, 2, -7, 3, -5}. Seus subarrays podem ser {-10, 5, 1, 6}, {5, 1, 6} ou {2, -7, 3, -5}, e assim por diante. No entanto, {5, 1, 6, 3} não pode ser um subarray porque os elementos não estão em uma sequência contígua.

Subarray Contíguo de Maior Soma

Se você observar, dentre todos os subconjuntos de matrizes, o subconjunto destacado {5, 1, 6} possui o maior valor de somatório:

Maior soma de submatriz contígua destacada

A soma do subconjunto {5, 1, 6} é 12, a soma máxima entre todos os subconjuntos possíveis do array acima. Portanto, para este array, o subconjunto contíguo com a soma máxima é {5, 1, 6}.

Abordagem simples para resolver o problema da maior soma de submatriz contígua.

A maneira simples de resolver esse problema é usar dois loops para encontrar todas as submatrizes, calcular a soma e então encontrar seu valor máximo.

Aqui está o fluxograma da abordagem simples para encontrar a maior soma de subvetores contíguos. Esta é uma abordagem de força bruta, pois percorremos todos os subvetores possíveis.

Abordagem simples para resolver a maior soma

Aqui estão as etapas simples para fazer isso.

Passo 1) Inicializar soma_máxima com o menor valor inteiro e definido começar e final para zero.

Passo 2) Deixei i e j sejam índices de matriz onde j é maior que ou igual a i; i marca o início do subconjunto e j seu fim.

Passo 3) soma_atual contém a soma acumulada. Após cada atualização, verifique se soma_atual é melhor que soma_máxima.

Passo 4) If soma_atual é maior, substitua soma_máxima com ela.

Passo 5) Ao j Ao atingir o final da matriz, incremente. i e resetar soma_atual para 0.

Passo 6) Repetir até i alcança o final da matriz. soma_máxima então contém a soma do maior subconjunto.

Apelido Code para uma abordagem simples

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

C++ Implementação de abordagem simples

#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]));
}

Saída:

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

Python Implementação de abordagem simples

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)

Saída:

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

Algoritmo de Kadane para encontrar a maior soma de submatriz contígua.

O Algoritmo de Kadane é um método de Programação Dinâmica que utiliza um único laço em vez de dois. Ele lida com arrays contendo números positivos e negativos, desde que pelo menos um valor seja não negativo.

Precisamos apenas de duas variáveis ​​para encontrar a maior soma de submatriz contígua. Aqui está o fluxograma:

Algoritmo de Kadane para encontrar a maior soma

Aqui estão as etapas para o Algoritmo de Kadane:

Passo 1) Crie duas variáveis, soma_atual e soma_máxima.

soma_atual Mantém a soma máxima que termina em um índice específico da matriz, enquanto soma_máxima Armazena o maior valor de soma observado até o momento.

Passo 2) Adicione cada elemento da matriz a soma_atualEm seguida, verifique as duas condições abaixo:

  • If soma_atual se for menor que o elemento atual, então soma_atual torna-se o elemento atual.
  • If soma_máxima é inferior a soma_atual, Em seguida soma_máxima torna-se soma_atual.

Passo 3) Após repetir a etapa anterior para toda a matriz, soma_máxima detém a maior soma de submatriz contígua.

Exemplo de Algoritmo de Kadane

Demonstramos o Algoritmo de Kadane em um pequeno arranjo e descrevemos cada passo para encontrar o subarranjo contíguo de maior soma.

Vamos supor que o array fornecido seja semelhante ao seguinte:

Exemplo de Algoritmo de Kadane

Aqui estão os passos do Algoritmo de Kadane:

Passo 1) Crie duas variáveis, soma_atual e soma_máximaAtribua INT_MIN a soma_máxima e zero a soma_atualAqui, INT_MIN representa o menor valor inteiro.

Passo 2) No índice 0, o valor é 4. Portanto, soma_atual = 0 + 4 = 4. Já que soma_atual é maior que soma_máxima, soma_máxima torna-se 4.

Exemplo do passo 2 do algoritmo de Kadane

Passo 3) No índice 1, o valor é -2. Portanto, soma_atual = 4 + (-2) = 2.

Desta vez soma_atual é inferior a soma_máximaConsequentemente, o valor de soma_máxima não é atualizado.

Exemplo do passo 3 do algoritmo de Kadane

Passo 4) O próximo valor é 1. Adicionando-o a soma_atual dá 3. Já que soma_máxima (4) ainda é maior que soma_atual, soma_máxima não é atualizado.

Exemplo do passo 4 do algoritmo de Kadane

Passo 5) No índice 3, o valor é 3. Incrementando soma_atual por 3 dá soma_atual = 6.

Exemplo do passo 5 do algoritmo de Kadane

Neste caso, soma_máxima É menor que soma_atual, assim soma_máxima é atualizado com o valor de soma_atual.

Passo 6) Para o último elemento da matriz, temos -1. Adicionando-o a soma_atual resulta em 5, que é menor que soma_máxima. Assim, soma_máxima permanece 6.

Exemplo do passo 6 do algoritmo de Kadane

Ao chegarmos ao final do array, o algoritmo termina aqui. Agora, soma_máxima contém a soma máxima, que é 6. O subconjunto é {4, -2, 1, 3}.

Apelido Code para o 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++ Implementação do 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]));
}

Saída:

largest sum is 12

Python Implementação do 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])

Saída:

largest sum is 12

Análise de complexidade para a maior submatriz contígua de soma

A abordagem simples utiliza dois loops para calcular a soma de todos os subconjuntos possíveis e localizar o maior deles. É uma abordagem de força bruta; cada loop percorre todo o intervalo até o final da matriz. ordemdando O(N²) tempo.

O algoritmo de Kadane usa apenas um laço, resultando em tempo O(N) e espaço extra O(1). Em um array de 100 elementos, a abordagem simples realiza 100 × 100 = 10,000 operações, enquanto a de Kadane realiza apenas 100 — uma aceleração drástica para entradas grandes.

Perguntas Frequentes

O algoritmo de Kadane fundamenta a engenharia de recursos de IA para dados de séries temporais, detecção de janelas anômalas e compartilhamento de recompensas.ping Na aprendizagem por reforço, ajudaping Os modelos identificam o intervalo de soma positiva mais forte em sinais ruidosos.

Sim. O GitHub Copilot e o GPT geram resultados confiáveis ​​do algoritmo de Kadane em Python, C++ e Java, incluindo variantes que retornam os índices inicial e final da submatriz vencedora.

O algoritmo de Kadane tem complexidade de tempo O(N) e espaço auxiliar O(1) porque realiza uma única passagem. tracrei apenas uma soma acumulada e o melhor valor obtido até o momento.

Inicialize max_sum com o primeiro elemento ou com infinito negativo em vez de zero. O algoritmo então retorna o elemento menos negativo, que é a resposta correta.

Os usos comuns incluem janelas de lucro para compra e venda de ações, somas de bordas de imagens, intervalos de pontuação genômica e análise de risco financeiro, onde a melhor janela de retorno contígua é crucial.

Trac`ka` é um índice inicial temporário sempre que `current_sum` é redefinido para o elemento atual. Quando `max_sum` é atualizado, os índices inicial e final são capturados para que o subvetor de resposta possa ser fatiado no final.

O algoritmo de divisão e conquista resolve o problema do subvetor máximo em O(N log N) combinando somas à esquerda, à direita e de cruzamento. O algoritmo de Kadane é mais rápido, com complexidade O(N), e mais fácil de codificar.

Sim. O de Kadane é um exemplo canônico de programação dinâmica com estado O(1), onde cada novo máximo terminando no índice i depende do máximo terminando no índice i menos um mais o elemento atual.

Resuma esta postagem com: