logo

Algoritmo de Kadane

El algoritmo de Kadane es un enfoque de programación dinámica que se utiliza para resolver el problema del subarreglo máximo, que implica encontrar el subarreglo contiguo con la suma máxima en un arreglo de números. El algoritmo fue propuesto por Jay Kadane en 1984 y tiene una complejidad temporal de O(n).

Historia del algoritmo de Kadane:

El algoritmo de Kadane lleva el nombre de su inventor, Jay Kadane, profesor de informática en la Universidad Carnegie Mellon. Describió por primera vez el algoritmo en un artículo titulado 'Problema del subconjunto de suma máxima' publicado en el Journal of the Association for Computing Machinery (ACM) en 1984.

El problema de encontrar el subconjunto máximo ha sido estudiado por informáticos desde la década de 1970. Es un problema bien conocido en el campo del diseño y análisis de algoritmos y tiene aplicaciones en una amplia gama de áreas, incluido el procesamiento de señales, las finanzas y la bioinformática.

Antes del algoritmo de Kadane, se habían propuesto otros algoritmos para resolver el problema de subarreglo máximo, como el enfoque de fuerza bruta que verifica todos los subarreglos posibles y el algoritmo de divide y vencerás. Sin embargo, estos algoritmos tienen mayor complejidad temporal y son menos eficientes que el algoritmo de Kadane.

El algoritmo de Kadane se utiliza ampliamente en informática y se ha convertido en un ejemplo clásico de programación dinámica. Su simplicidad, eficiencia y elegancia lo han convertido en una solución popular para el problema de subarreglo máximo y una herramienta valiosa en el diseño y análisis de algoritmos.

Funcionamiento del algoritmo de Kadene:

El algoritmo funciona iterando sobre la matriz y realizando un seguimiento de la suma máxima del subarreglo que termina en cada posición. En cada posición i, tenemos dos opciones: agregar el elemento en la posición i al subarreglo máximo actual o comenzar un nuevo subarreglo en la posición i. El máximo de estas dos opciones es el subarreglo máximo que termina en la posición i.

Mantenemos dos variables, max_so_far y max_ending_here, para realizar un seguimiento de la suma máxima vista hasta ahora y la suma máxima que finaliza en la posición actual, respectivamente. El algoritmo comienza estableciendo ambas variables en el primer elemento de la matriz. Luego, iteramos sobre la matriz desde el segundo elemento hasta el final.

En cada posición i, actualizamos max_ending_here tomando el máximo del elemento actual y el elemento actual agregado al subarreglo máximo anterior. Luego actualizamos max_so_far para que sea el máximo de max_so_far y max_ending_here.

matriz de látex

El algoritmo devuelve max_so_far, que es la suma máxima de cualquier submatriz de la matriz.

Aquí está el proceso paso a paso del algoritmo de Kadane:

1. Inicialice dos variables, max_hasta_lejos y max_ending_aquí , al primer elemento de la matriz.

max_so_far = arreglo[0]

max_ending_here = arreglo[0]

2. Repita la matriz desde el segundo elemento hasta el final:

para i de 1 a n-1 hago:

3. Calcule la suma máxima que termina en la posición actual:

entrada de usuario java

max_ending_here = max(arreglo[i], max_ending_aquí + arreglo[i])

4. Actualice max_so_far para que sea el máximo de max_so_far y max_ending_here:

max_hasta_far = max(max_hasta_far, max_ending_here)

5. Devuelve max_so_far como la suma máxima de cualquier submatriz de la matriz.

La complejidad temporal del algoritmo de Kadane es O (n), donde n es la longitud de la matriz de entrada. Esto lo convierte en una solución muy eficiente para el problema del subarreglo máximo.

Ejemplo:

Veamos un ejemplo de cómo funciona el algoritmo de Kadane:

Supongamos que tenemos la siguiente matriz de números enteros:

 arr = [-2, 1, -3, 4, -1, 2, 1, -5, 4] 

Queremos encontrar la suma máxima de subarreglos de este arreglo. Podemos aplicar el algoritmo de Kadane para resolver este problema.

Empezamos inicializando dos variables:

    max_hasta ahora:Esta variable realizará un seguimiento de la suma máxima de subarreglos que hemos visto hasta ahora.max_ending_aquí:Esta variable realizará un seguimiento de la suma máxima que finaliza en el índice actual.
 max_so_far = INT_MIN; max_ending_here = 0; 

Luego, iteramos a través de la matriz, comenzando desde el segundo elemento:

¿Qué es Ubuntu esencial para la construcción?
 for i in range(1, len(arr)): 

Actualice la suma actual agregando el elemento actual a la suma anterior:

 max_ending_here = max(arr[i], max_ending_here + arr[i]) 

Actualiza la suma máxima vista hasta el momento:

 max_so_far = max(max_so_far, max_ending_here) 

En cada iteración, actualizamos la suma actual agregando el elemento actual a la suma anterior o iniciando una nueva submatriz en el elemento actual. Luego actualizamos la suma máxima vista hasta ahora comparándola con la suma actual.

Después de recorrer toda la matriz, el valor de max_so_far será la suma máxima del subarreglo de la matriz dada.

En este ejemplo, la suma máxima del subarreglo es 6, que corresponde al subarreglo [4, -1, 2, 1].

Implementación de código en Java:

 import java.io.*; import java.util.*; public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in); System.out.print(&apos;Enter the size of the array : &apos;); int n=sc.nextInt(); int[] arr=new int[n]; System.out.println(&apos;Enter the elements of the array : &apos;); for(int i=0;i<n;i++){ arr[i]="sc.nextInt();" } int max_so_far="Integer.MIN_VALUE,max_ending_here=0;" for(int i="0;i&lt;n;i++)" { max_ending_here+="arr[i];" if(max_so_far<max_ending_here){ if(max_ending_here<0){ max_ending_here="0;" system.out.print('the maximum contiguous sum in the array is : '+max_so_far); < pre> <p> <strong>Output</strong> </p> <pre> Enter the size of the array : 9 Enter the elements of the array : -2 1 -3 4 -1 2 1 -5 4 The Maximum contiguous sum in the array is : 6 </pre> <h3>Code Implementation in C++:</h3> <pre> #include using namespace std; int main() { int a[] = { -2, -3, 4, -1, -2, 1, 5, -3 }; int n = sizeof(a) / sizeof(a[0]); // Kadane&apos;s algorithm int max_so_far = INT_MIN, max_ending_here = 0; for (int i = 0; i <n; i++) { max_ending_here="max_ending_here" + a[i]; if (max_so_far < max_ending_here) max_so_far="max_ending_here;" (max_ending_here 0) } cout << 'maximum contiguous sum in the array is : '<<max_so_far<<endl; return 0; pre> <p> <strong>Output</strong> </p> <pre> Maximum contiguous sum in the array is : 7 </pre> <h2>Advantages and Disadvantages of Kadane&apos;s algorithm:</h2> <h3>Advantages of Kadane&apos;s Algorithm:</h3> <ul> <tr><td>Efficiency:</td> Kadane&apos;s Algorithm has a time complexity of O(n), which makes it very efficient for solving the maximum subarray problem. This makes it a great solution for large datasets. </tr><tr><td>Simplicity:</td> Kadane&apos;s Algorithm is relatively easy to understand and implement compared to other algorithms for solving the maximum subarray problem, such as the divide-and-conquer algorithm. </tr><tr><td>Space Complexity:</td> Kadane&apos;s Algorithm has a space complexity of O(1), which means it uses a constant amount of memory irrespective of the size of the input array. </tr><tr><td>Dynamic Programming:</td> Kadane&apos;s Algorithm is a classic example of dynamic programming, a technique that breaks down a problem into smaller subproblems and stores the solutions to these subproblems to avoid redundant computation. </tr></ul> <h3>Disadvantages of Kadane&apos;s Algorithm:</h3> <ul> <tr><td>Only finds sum and not the subarray itself:</td> Kadane&apos;s Algorithm only finds the maximum sum of the subarray and not the actual subarray itself. If you need to find the subarray that has the maximum sum, you will need to modify the algorithm accordingly. </tr><tr><td>Does not handle negative numbers well:</td> If an input array has only negative numbers, the algorithm will return the maximum negative number instead of 0. This can be overcome by adding an additional step to the algorithm to check if the array has only negative numbers. </tr><tr><td>Not suitable for non-contiguous subarrays:</td> Kadane&apos;s Algorithm is specifically designed for contiguous subarrays and may not be suitable for solving problems that involve non-contiguous subarrays. </tr></ul> <h2>Applications of Kadane&apos;s algorithm:</h2> <p>There are some of its applications like the following:</p> <ul> <tr><td>Maximum subarray sum:</td> As we saw in the example above, Kadane&apos;s algorithm is used to find the maximum subarray sum of an array of integers. This is a common problem in computer science and has applications in data analysis, financial modeling, and other fields. </tr><tr><td>Stock trading:</td> Kadane&apos;s algorithm can be used to find the maximum profit that can be made by buying and selling a stock on a given day. The input to the algorithm is an array of stock prices, and the output is the maximum profit that can be made by buying and selling the stock at different times. </tr><tr><td>Image processing:</td> Kadane&apos;s algorithm can be used in image processing applications to find the largest contiguous area of pixels that meet a certain condition, such as having a certain color or brightness. This can be useful for tasks such as object recognition and segmentation. </tr><tr><td>DNA sequencing:</td> Kadane&apos;s algorithm can be used in bioinformatics to find the longest subsequence of DNA that meets certain conditions. For example, it can be used to find the longest common subsequence between two DNA sequences or to find the longest subsequence that does not contain certain patterns. </tr><tr><td>Machine learning:</td> Kadane&apos;s algorithm can be used in some machine learning applications, such as reinforcement learning and dynamic programming, to find the optimal policy or action sequence that maximizes a reward function. </tr></ul> <p>Therefore, we can say the advantages of Kadane&apos;s Algorithm make it a great solution for solving the maximum subarray problem, especially for large datasets. However, its limitations must be considered when using it for specific applications.</p> <hr></n;></pre></n;i++){>

Implementación de código en C++:

 #include using namespace std; int main() { int a[] = { -2, -3, 4, -1, -2, 1, 5, -3 }; int n = sizeof(a) / sizeof(a[0]); // Kadane&apos;s algorithm int max_so_far = INT_MIN, max_ending_here = 0; for (int i = 0; i <n; i++) { max_ending_here="max_ending_here" + a[i]; if (max_so_far < max_ending_here) max_so_far="max_ending_here;" (max_ending_here 0) } cout << \'maximum contiguous sum in the array is : \'<<max_so_far<<endl; return 0; pre> <p> <strong>Output</strong> </p> <pre> Maximum contiguous sum in the array is : 7 </pre> <h2>Advantages and Disadvantages of Kadane&apos;s algorithm:</h2> <h3>Advantages of Kadane&apos;s Algorithm:</h3> <ul> <tr><td>Efficiency:</td> Kadane&apos;s Algorithm has a time complexity of O(n), which makes it very efficient for solving the maximum subarray problem. This makes it a great solution for large datasets. </tr><tr><td>Simplicity:</td> Kadane&apos;s Algorithm is relatively easy to understand and implement compared to other algorithms for solving the maximum subarray problem, such as the divide-and-conquer algorithm. </tr><tr><td>Space Complexity:</td> Kadane&apos;s Algorithm has a space complexity of O(1), which means it uses a constant amount of memory irrespective of the size of the input array. </tr><tr><td>Dynamic Programming:</td> Kadane&apos;s Algorithm is a classic example of dynamic programming, a technique that breaks down a problem into smaller subproblems and stores the solutions to these subproblems to avoid redundant computation. </tr></ul> <h3>Disadvantages of Kadane&apos;s Algorithm:</h3> <ul> <tr><td>Only finds sum and not the subarray itself:</td> Kadane&apos;s Algorithm only finds the maximum sum of the subarray and not the actual subarray itself. If you need to find the subarray that has the maximum sum, you will need to modify the algorithm accordingly. </tr><tr><td>Does not handle negative numbers well:</td> If an input array has only negative numbers, the algorithm will return the maximum negative number instead of 0. This can be overcome by adding an additional step to the algorithm to check if the array has only negative numbers. </tr><tr><td>Not suitable for non-contiguous subarrays:</td> Kadane&apos;s Algorithm is specifically designed for contiguous subarrays and may not be suitable for solving problems that involve non-contiguous subarrays. </tr></ul> <h2>Applications of Kadane&apos;s algorithm:</h2> <p>There are some of its applications like the following:</p> <ul> <tr><td>Maximum subarray sum:</td> As we saw in the example above, Kadane&apos;s algorithm is used to find the maximum subarray sum of an array of integers. This is a common problem in computer science and has applications in data analysis, financial modeling, and other fields. </tr><tr><td>Stock trading:</td> Kadane&apos;s algorithm can be used to find the maximum profit that can be made by buying and selling a stock on a given day. The input to the algorithm is an array of stock prices, and the output is the maximum profit that can be made by buying and selling the stock at different times. </tr><tr><td>Image processing:</td> Kadane&apos;s algorithm can be used in image processing applications to find the largest contiguous area of pixels that meet a certain condition, such as having a certain color or brightness. This can be useful for tasks such as object recognition and segmentation. </tr><tr><td>DNA sequencing:</td> Kadane&apos;s algorithm can be used in bioinformatics to find the longest subsequence of DNA that meets certain conditions. For example, it can be used to find the longest common subsequence between two DNA sequences or to find the longest subsequence that does not contain certain patterns. </tr><tr><td>Machine learning:</td> Kadane&apos;s algorithm can be used in some machine learning applications, such as reinforcement learning and dynamic programming, to find the optimal policy or action sequence that maximizes a reward function. </tr></ul> <p>Therefore, we can say the advantages of Kadane&apos;s Algorithm make it a great solution for solving the maximum subarray problem, especially for large datasets. However, its limitations must be considered when using it for specific applications.</p> <hr></n;>

Ventajas y desventajas del algoritmo de Kadane:

Ventajas del algoritmo de Kadane:

    Eficiencia:El algoritmo de Kadane tiene una complejidad temporal de O(n), lo que lo hace muy eficiente para resolver el problema de subarreglo máximo. Esto lo convierte en una excelente solución para grandes conjuntos de datos.Sencillez:El algoritmo de Kadane es relativamente fácil de entender e implementar en comparación con otros algoritmos para resolver el problema de subarreglo máximo, como el algoritmo de divide y vencerás.Complejidad espacial:El algoritmo de Kadane tiene una complejidad espacial de O(1), lo que significa que utiliza una cantidad constante de memoria independientemente del tamaño de la matriz de entrada.Programación dinámica:El algoritmo de Kadane es un ejemplo clásico de programación dinámica, una técnica que divide un problema en subproblemas más pequeños y almacena las soluciones a estos subproblemas para evitar cálculos redundantes.

Desventajas del algoritmo de Kadane:

    Solo encuentra la suma y no el subarreglo en sí:El algoritmo de Kadane solo encuentra la suma máxima del subconjunto y no el subconjunto real. Si necesita encontrar el subarreglo que tiene la suma máxima, deberá modificar el algoritmo en consecuencia.No maneja bien números negativos:Si una matriz de entrada solo tiene números negativos, el algoritmo devolverá el número negativo máximo en lugar de 0. Esto se puede superar agregando un paso adicional al algoritmo para verificar si la matriz solo tiene números negativos.No apto para subarreglos no contiguos:El algoritmo de Kadane está diseñado específicamente para subarreglos contiguos y puede no ser adecuado para resolver problemas que involucran subarreglos no contiguos.

Aplicaciones del algoritmo de Kadane:

Existen algunas de sus aplicaciones como las siguientes:

    Suma máxima de subarreglo:Como vimos en el ejemplo anterior, el algoritmo de Kadane se utiliza para encontrar la suma máxima de subarreglo de una matriz de números enteros. Este es un problema común en informática y tiene aplicaciones en análisis de datos, modelos financieros y otros campos.El comercio de acciones:El algoritmo de Kadane se puede utilizar para encontrar el beneficio máximo que se puede obtener comprando y vendiendo una acción en un día determinado. La entrada al algoritmo es una serie de precios de acciones y la salida es el beneficio máximo que se puede obtener comprando y vendiendo acciones en diferentes momentos.Procesamiento de imágenes:El algoritmo de Kadane se puede utilizar en aplicaciones de procesamiento de imágenes para encontrar el área contigua más grande de píxeles que cumplan una determinada condición, como tener un determinado color o brillo. Esto puede resultar útil para tareas como el reconocimiento y la segmentación de objetos.Secuencia ADN:El algoritmo de Kadane se puede utilizar en bioinformática para encontrar la subsecuencia más larga de ADN que cumpla determinadas condiciones. Por ejemplo, se puede utilizar para encontrar la subsecuencia común más larga entre dos secuencias de ADN o para encontrar la subsecuencia más larga que no contiene ciertos patrones.Aprendizaje automático:El algoritmo de Kadane se puede utilizar en algunas aplicaciones de aprendizaje automático, como el aprendizaje por refuerzo y la programación dinámica, para encontrar la política o secuencia de acción óptima que maximice una función de recompensa.

Por lo tanto, podemos decir que las ventajas del algoritmo de Kadane lo convierten en una excelente solución para resolver el problema de subarreglo máximo, especialmente para conjuntos de datos grandes. Sin embargo, se deben considerar sus limitaciones al utilizarlo para aplicaciones específicas.