¿Cómo es codicioso el algoritmo de Kruskal?

Como dice Wikipedia:

Un algoritmo codicioso es un algoritmo que sigue la heurística de resolución de problemas de hacer la elección óptima localmente en cada etapa con la esperanza de encontrar un óptimo global

Cual es nuestro problema Necesitamos encontrar el árbol de expansión mínimo del gráfico dado. Esta es una optimización global que debemos hacer. No nos importan los bordes individuales que forman parte del árbol de soluciones. De hecho, si lo piensa, bien podría suceder que un borde más pesado de un vértice sea parte de la solución, mientras que un borde más ligero no figura en él.

¿Y cómo resuelve el problema el algoritmo de Kruskal? Simplemente selecciona el borde más pequeño en cada paso y lo agrega al árbol si mantiene intacta la propiedad del árbol. En este momento no nos preocupamos por lo que sucederá cuando agreguemos los bordes más pesados ​​a la mezcla. Esto parecería contradictorio para una persona que no ha visto el análisis del algoritmo debido a la observación anterior de que un borde más pesado podría ser parte de la solución mientras que un borde más ligero no figura en él. Sin embargo, podemos hacer la elección óptima a nivel local de elegir el siguiente borde más ligero porque hemos demostrado que el borde agregado no puede reemplazar un borde existente en una solución óptima. El hecho de que estamos ignorando el efecto de todos los bordes futuros (más pesados) mientras procesamos el borde actual es lo que hace que esto sea codicioso.

Para comprender esto, considere otro problema: dada una matriz que contiene enteros positivos, elija el subconjunto de elementos que proporciona la suma máxima con la restricción de que no se deben seleccionar dos elementos adyacentes.

Si tratamos de resolver esto de la manera de Kruskal, clasificaríamos la matriz en orden decreciente y elegiríamos los elementos y los agregaríamos a la suma siempre que el elemento actual en consideración no sea adyacente a ningún elemento existente en la matriz. Pero si lo aplicamos a la matriz [6,10,6] el algoritmo de Kruskalish devolvería que la solución óptima es 10 mientras que la óptima real es 12.

Es codicioso en el sentido de que continúa persiguiendo una rama hasta que se quede sin opciones, de la misma manera que lo hace un algoritmo de coincidencia de expresiones regulares. Como mencionó Bulat Bochkariov, esto no necesariamente proporciona una solución óptima.

Así es como funciona la codicia en las expresiones regulares:

[…] El plus hace que el motor de expresiones regulares repita el token anterior con la mayor frecuencia posible. Solo si eso hace que falle la expresión regular completa, el motor de expresión regular retrocederá . Es decir, volverá a la ventaja, hará que abandone la última iteración y proceda con el resto de la expresión regular.

de http: //www.regular-expressions.i

Aquí hay una representación visual interactiva del algoritmo de Krusal en Java (a través de Wikipedia):
http://students.ceid.upatras.gr/

Siempre seleccionamos el borde de peso más pequeño que no causa un ciclo en el árbol de expansión causado hasta ahora, por lo tanto, siempre tomamos la mejor opción óptima localmente con el objetivo de encontrar una opción óptima global, por lo que se supone que elegir sucesivamente el borde de peso más pequeño resultará en la suma mínima global (global) de pesos. Tiene una complejidad de [matemáticas] O (ElogV) [/ matemáticas]