¿Se puede programar un algoritmo complejo de una manera simple? Suponga que no se necesitan optimizaciones.

Interpreto la pregunta como preguntar por la diferencia en complejidad y comprensión entre el algoritmo tal como aparece en un libro de texto y el algoritmo tal como aparece en el código fuente de un programa.

Una vez que el algoritmo es suficientemente complejo, entonces su implementación no necesita agregar mucha complejidad:

El algoritmo en el libro de texto debe describirse utilizando algún tipo de formalismo. Lo que siempre puedes hacer es construir un intérprete para ese formalismo. Eso le permitirá expresar el algoritmo en su forma original, por lo que realmente no hay complejidad de tener que representarlo en un idioma en particular.

Por supuesto, esto significa que debe implementar el intérprete. ¡Pero crucialmente, la complejidad del intérprete no depende de la complejidad del algoritmo ! Entonces, si consideramos algoritmos suficientemente complejos , la complejidad de la sobrecarga del intérprete se vuelve insignificante.

Por supuesto, en la práctica generalmente nos interesan algoritmos mucho más simples en los que incluir un intérprete para un formalismo diferente no sería insignificante (de hecho, para la mayoría de los algoritmos comunes, escribir un intérprete sería más complejo que volver a expresar el algoritmo en un idioma diferente ) En ese caso, realmente depende de qué tan bien coincida la descripción del algoritmo que desea implementar con el lenguaje de computadora en el que lo va a representar.

Tradicionalmente, los algoritmos a menudo se dan en un pseudocódigo que es una mezcla de estilos de programación imperativos, orientados a objetos y, a veces, funcionales. Estos paradigmas son compatibles con la mayoría de los lenguajes modernos, por lo que en tales casos la implementación debe coincidir bastante bien con la descripción original y el programa debe permanecer relativamente razonable y no mucho más tiempo que en la descripción original del algoritmo.

Las cosas se vuelven más difíciles si la descripción original del algoritmo es un diagrama de flujo, porque hay muchos diagramas de flujo simples y naturales que no tienen una representación limpia en los lenguajes imperativos existentes (algo que siempre me ha molestado mucho).

Por supuesto, es aún peor si la descripción original está en código de máquina y tiene que implementarla en un lenguaje funcional puro, o viceversa. En tales casos, la mejor solución puede ser simplemente cambiar a un algoritmo diferente, uno que haga el mismo trabajo pero que sea más fácil de expresar en el idioma de destino.

¿Qué es “una manera simple”?

Por ejemplo, imagine un problema común: tiene una compañía de camiones y envía camiones a todo Estados Unidos. Desea que cada camión elija siempre la ruta más corta y que regrese a la base.

Necesita un algoritmo para encontrar siempre la ruta más corta en todas las carreteras de EE. UU.

Bueno, la solución más clásica para este problema es: el algoritmo de Dijkstra – Wikipedia

Es un problema fácil de promediar en Graph Theory. Hay problemas mucho, mucho más complejos para resolver.

Una buena implementación en C (Fuente: algoritmo de Dijsktra – Geeks para Geeks)

// Función que implementa el algoritmo de ruta más corta de fuente única de Dijkstra
// para un gráfico representado mediante representación de matriz de adyacencia
vacío dijkstra (int gráfico [V] [V], int src)
{
int dist [V]; // La matriz de salida. dist [i] tendrá el más corto
// distancia de src a i

bool sptSet [V]; // sptSet [i] será verdadero si el vértice i se incluye en el más corto
// se finaliza el árbol de ruta o la distancia más corta de src a i

// Inicializa todas las distancias como INFINITE y stpSet [] como false
para (int i = 0; i dist [i] = INT_MAX, sptSet [i] = falso;

// La distancia del vértice fuente de sí mismo es siempre 0
dist [src] = 0;

// Encuentra el camino más corto para todos los vértices
para (int cuenta = 0; cuenta {
// Elija el vértice de distancia mínima del conjunto de vértices no
// aún procesado. u siempre es igual a src en la primera iteración.
int u = minDistance (dist, sptSet);

// Marcar el vértice elegido como procesado
sptSet [u] = verdadero;

// Actualiza el valor dist de los vértices adyacentes del vértice seleccionado.
para (int v = 0; v

// Actualice dist [v] solo si no está en sptSet, hay un borde de
// u to v, y el peso total de la ruta de src a v a través de u es
// menor que el valor actual de dist [v]
if (! sptSet [v] && graph [u] [v] && dist [u]! = INT_MAX
&& dist [u] + gráfico [u] [v] dist [v] = dist [u] + gráfico [u] [v];
}

// imprime la matriz de distancia construida
printSolution (dist, V);
}

¿Es simple el algoritmo? Bueno, en mi opinión, es tan simple como podría ser.

Por supuesto, necesitará leer un poco sobre cómo funciona el algoritmo para comprenderlo adecuadamente. No hay “magia”, incluso si el código está bien escrito, un programador de aprendizaje tendrá que rascarse un poco la cabeza para entenderlo.

Un programa es solo un algoritmo escrito en un lenguaje de programación que se ejecuta en una computadora. Entonces, si el algoritmo es complejo, entonces también lo sería el programa en el que está escrito. Supongo que en este caso realmente depende del idioma. Por ejemplo, un programa en C podría ser más complejo que un programa en, por ejemplo, Python.

More Interesting

¿Puedo hacer un generador de algoritmos en C / C ++? Por generador de algoritmos me refiero a un programa que pide entrada y salida esperada y, sobre la base de eso, proporciona la lógica del programa.

¿Qué son las estructuras de datos y por qué las usamos? ¿Cuál es su relación con los algoritmos?

¿Qué tipo de algoritmo SLAM utiliza Teslas? ¿O incluso están usando algoritmos SLAM?

Cómo encontrar el promedio de todos los múltiplos de un número de un rango de números

Cómo mejorar mis algoritmos de clasificación

¿Cuántos rectángulos de 3 × 5 caben en un rectángulo de 18 x 26? ¿Hay una manera simple de calcular?

¿Cómo funciona el algoritmo de Youtube en términos de tendencias de un video?

Analizador de programación: ¿por qué devolvemos los datos restantes (no consumidos) mientras escribimos un analizador?

¿Hay alguna manera de girar a la izquierda / derecha una matriz binaria en menos de O (n) tiempo?

¿Existe un algoritmo borroso que replica la miopía?

¿Por qué un árbol de segmentos necesita una matriz de tamaño 4n? ¿Por qué no 2n-1?

Cómo mejorar la lógica o la presentación de la conjetura descrita en una respuesta para que más personas puedan entender lo que creo que es un método sorprendente para crear algorítmicamente un conjunto primo potencialmente infinito

¿Qué idioma es mejor para comprender la importancia de las estructuras de datos?

¿Debería buscar la máquina de vectores de soporte (SVM) o la red neuronal (NN)? ¿Cual es mejor?

¿Es útil leer 5 o más libros para algoritmos, o debería leer solo uno o dos y usar los otros como referencia para algún algoritmo en particular?