stringtranslate.com

Algoritmo

En un bucle, resta el número mayor del número menor. Detén el ciclo cuando la resta haga que un número sea negativo. Evalúa dos números si uno de ellos es igual a cero o no. En caso afirmativo, tome el otro número como máximo común divisor. Si no, vuelva a colocar los dos números en el ciclo de resta.
Diagrama de flujo del uso de restas sucesivas para encontrar el máximo común divisor de los números r y s

En matemáticas e informática , un algoritmo ( / ˈ æ l ɡ ə r ɪ ð əm / ) es una secuencia finita deinstruccionesmatemáticamente rigurosasproblemaso para realizar uncálculo.[1]Los algoritmos se utilizan como especificaciones para realizarcálculosyprocesamiento de datos. Los algoritmos más avanzados pueden usarcondicionalespara desviar la ejecución del código a través de varias rutas (lo que se conoce comotoma de decisiones automatizada) y deducirinferencias(lo que se conoce comorazonamiento automatizado), lograndoeventualmentela automatizaciónAlan Turingya practicaba el uso metafórico de características humanas como descriptores de máquinascon términos como "memoria", "búsqueda" y "estímulo".[2]

Por el contrario, una heurística es un enfoque para la resolución de problemas que puede no estar completamente especificado o no garantizar resultados correctos u óptimos, especialmente en dominios de problemas donde no existe un resultado correcto u óptimo bien definido. [3] Por ejemplo, los sistemas de recomendación de redes sociales se basan en heurísticas de tal manera que, aunque se caracterizan ampliamente como "algoritmos" en los medios populares del siglo XXI, no pueden ofrecer resultados correctos debido a la naturaleza del problema.

Como método eficaz , un algoritmo se puede expresar dentro de una cantidad finita de espacio y tiempo [4] y en un lenguaje formal bien definido [5] para calcular una función . [6] A partir de un estado inicial y una entrada inicial (quizás vacía ), [7] las instrucciones describen un cálculo que, cuando se ejecuta , avanza a través de un número finito [8] de estados sucesivos bien definidos, y eventualmente produce una "salida" [ 9] y terminando en un estado final final. La transición de un estado al siguiente no es necesariamente determinista ; Algunos algoritmos, conocidos como algoritmos aleatorios , incorporan entradas aleatorias. [10]

Etimología

Alrededor del año 825 d.C., el científico y erudito persa Muḥammad ibn Mūsā al-Khwārizmī escribió kitāb al-ḥisāb al-hindī ("Libro de computación india") y kitab al-jam' wa'l-tafriq al-ḥisāb al-hindī ("Adición y resta en la aritmética india"). [1] A principios del siglo XII, aparecieron traducciones latinas de dichos textos de al-Khwarizmi que involucraban el sistema de numeración y aritmética hindú-árabe , por ejemplo Liber Alghoarismi de practica arismetrice , atribuido a Juan de Sevilla , y Liber Algorismi de numero Indorum , atribuido a Adelardo de Bath . [2] Por la presente, alghoarismi o algorismi es la latinización del nombre de Al-Khwarizmi; el texto comienza con la frase Dixit Algorismi , o "Así habló Al-Khwarizmi". [3] Alrededor de 1230, la palabra inglesa algorismo está atestiguada y luego, por Chaucer en 1391, los ingleses adoptaron el término francés. [4] [5] [ se necesita aclaración ] En el siglo XV, bajo la influencia de la palabra griega ἀριθμός ( arithmos , "número"; cf. "aritmética"), la palabra latina fue alterada a algoritmus . [ cita necesaria ]

Definición

Una definición informal es "un conjunto de reglas que define con precisión una secuencia de operaciones", [11] [ necesita cita para verificar ] que incluiría todos los programas de computadora (incluidos los programas que no realizan cálculos numéricos) y (por ejemplo) cualquier procedimiento burocrático prescrito [12] o receta de libro de cocina . [13] En general, un programa es un algoritmo sólo si finalmente se detiene [14] , aunque a veces los bucles infinitos pueden resultar deseables. Boolos, Jeffrey & 1974, 1999 definen un algoritmo como un conjunto de instrucciones para determinar una salida, dadas explícitamente, en una forma que puede ser seguida por una máquina informática o por un ser humano que sólo puede realizar operaciones elementales específicas sobre símbolos. . [15]

El concepto de algoritmo también se utiliza para definir la noción de decidibilidad , noción central para explicar cómo surgen los sistemas formales a partir de un pequeño conjunto de axiomas y reglas. En lógica , el tiempo que requiere un algoritmo para completarse no se puede medir, ya que aparentemente no está relacionado con la dimensión física habitual. De estas incertidumbres, que caracterizan el trabajo en curso, se deriva la falta de disponibilidad de una definición de algoritmo que se adapte tanto al uso concreto (en cierto sentido) como al abstracto del término.

La mayoría de los algoritmos están pensados ​​para implementarse como programas informáticos . Sin embargo, los algoritmos también se implementan por otros medios, como en una red neuronal biológica (por ejemplo, el cerebro humano implementando la aritmética o un insecto buscando comida), en un circuito eléctrico o en un dispositivo mecánico.

Historia

Algoritmos antiguos

Desde la antigüedad se atestiguan procedimientos paso a paso para la resolución de problemas matemáticos. Esto incluye las matemáticas babilónicas (alrededor del 2500 a. C.), [16] las matemáticas egipcias (alrededor del 1550 a. C.), [16] las matemáticas indias (alrededor del 800 a. C. y posteriores), [17] [18] El Oráculo de Ifá (alrededor del 500 a. C.), Matemáticas griegas (alrededor del 240 a. C.), [19] y matemáticas árabes (alrededor del 800 d. C.). [20]

La evidencia más antigua de algoritmos se encuentra en las matemáticas babilónicas de la antigua Mesopotamia (el actual Irak). Una tablilla de arcilla sumeria encontrada en Shuruppak, cerca de Bagdad , que data de c.  2500 aC describió el primer algoritmo de división . [16] Durante la dinastía Hammurabi c.  1800  – c.  1600 a. C. , las tablillas de arcilla babilónicas describían algoritmos para calcular fórmulas. [21] Los algoritmos también se utilizaron en la astronomía babilónica . Las tablillas de arcilla babilónicas describen y emplean procedimientos algorítmicos para calcular la hora y el lugar de eventos astronómicos importantes. [22]

Los algoritmos para la aritmética también se encuentran en las matemáticas del antiguo Egipto , que se remontan al Papiro Matemático de Rhind c.  1550 a.C. [16] Los algoritmos se utilizaron más tarde en las matemáticas helenísticas antiguas . Dos ejemplos son el Tamiz de Eratóstenes , que fue descrito en la Introducción a la Aritmética por Nicómaco , [23] [19] : Capítulo 9.2  y el algoritmo euclidiano , que fue descrito por primera vez en los Elementos de Euclides ( c.  300 a. C. ). [19] : Capítulo 9.1  Ejemplos de matemáticas indias antiguas incluyeron los Shulba Sutras , la Escuela de Kerala y el Brāhmasphuṭasiddhānta . [17]

El primer algoritmo criptográfico para descifrar códigos cifrados fue desarrollado por Al-Kindi , un matemático árabe del siglo IX, en Un manuscrito sobre el descifrado de mensajes criptográficos . Dio la primera descripción del criptoanálisis mediante análisis de frecuencia , el primer algoritmo de descifrado de códigos. [20]

Ordenadores

Relojes impulsados ​​por peso

Bolter atribuye la invención del reloj impulsado por pesas como "el invento clave [de Europa en la Edad Media]". En particular, atribuye el mérito al mecanismo de escape [24] que nos proporciona el tic y tac de un reloj mecánico. "La máquina automática precisa" [25] condujo inmediatamente a los " autómatas mecánicos " a partir del siglo XIII y finalmente a las "máquinas computacionales": la máquina diferenciadora y las máquinas analíticas de Charles Babbage y la condesa Ada Lovelace , a mediados del siglo XIX. [26] A Lovelace se le atribuye la primera creación de un algoritmo destinado al procesamiento en una computadora (el motor analítico de Babbage, el primer dispositivo considerado una verdadera computadora Turing completa en lugar de solo una calculadora ) y a veces se le llama "el primer programador de la historia" como un resultado, aunque la implementación completa del segundo dispositivo de Babbage no se realizaría hasta décadas después de su vida.

Relé electromecánico

Bell y Newell (1971) indican que el telar Jacquard (1801), precursor de las tarjetas Hollerith (tarjetas perforadas, 1887), y las "tecnologías de conmutación telefónica" fueron las raíces de un árbol que condujo al desarrollo de las primeras computadoras. [27] A mediados del siglo XIX, el telégrafo , el precursor del teléfono, se utilizaba en todo el mundo; su codificación discreta y distinguible de letras como "puntos y rayas" era un sonido común. A finales del siglo XIX, el teletipo ( c.  1870 ) estaba en uso, al igual que el uso de tarjetas Hollerith en el censo estadounidense de 1890. Luego vino la teleimpresora ( c.  1910 ) con su uso en papel perforado del código Baudot en cinta.

Las redes de conmutación telefónica de relés electromecánicos (inventadas en 1835) fueron obra de George Stibitz (1937), el inventor del dispositivo sumador digital. Mientras trabajaba en los Laboratorios Bell, observó el uso "gravoso" de calculadoras mecánicas con engranajes. "Volvió a casa una noche de 1937 con la intención de probar su idea... Cuando terminaron los retoques, Stibitz había construido un dispositivo de suma binaria". [ 28] El matemático Martin Davis apoyó la particular importancia del relé electromecánico [29] .

Formalización

Diagrama de Ada Lovelace de " Note G ", el primer algoritmo informático publicado

En 1928, comenzó una formalización parcial del concepto moderno de algoritmos con intentos de resolver el Entscheidungsproblem (problema de decisión) planteado por David Hilbert . Las formalizaciones posteriores se enmarcaron como intentos de definir la " calculabilidad efectiva " [30] o el "método efectivo". [31] Esas formalizaciones incluyeron las funciones recursivas de GödelHerbrandKleene de 1930, 1934 y 1935, el cálculo lambda de Alonzo Church de 1936, la Formulación 1 de Emil Post de 1936 y las máquinas de Turing de Alan Turing de 1936-1937. y 1939.

Representaciones

Los algoritmos se pueden expresar en muchos tipos de notación, incluidos lenguajes naturales , pseudocódigo , diagramas de flujo , diagramas drakon , lenguajes de programación o tablas de control (procesadas por intérpretes ). Las expresiones de algoritmos en lenguaje natural tienden a ser detalladas y ambiguas y rara vez se utilizan para algoritmos complejos o técnicos. El pseudocódigo, los diagramas de flujo, los diagramas drakon y las tablas de control son formas estructuradas de expresar algoritmos que evitan muchas de las ambigüedades comunes en las declaraciones basadas en lenguaje natural. Los lenguajes de programación están destinados principalmente a expresar algoritmos en una forma que pueda ser ejecutada por una computadora, pero también se utilizan a menudo como una forma de definir o documentar algoritmos.

máquinas de turing

Existe una amplia variedad de representaciones posibles y se puede expresar un programa de máquina de Turing dado como una secuencia de tablas de máquina (ver máquina de estados finitos , tabla de transición de estados y tabla de control para obtener más información), como diagramas de flujo y diagramas de drakon (ver estado diagrama para obtener más información), o como una forma de código de máquina rudimentario o código ensamblador llamado "conjuntos de cuádruples" (consulte Máquina de Turing para obtener más información). Las representaciones de algoritmos también se pueden clasificar en tres niveles aceptados de descripción de la máquina de Turing: descripción de alto nivel, descripción de implementación y descripción formal. [32] Una descripción de alto nivel describe las cualidades del algoritmo en sí, ignorando cómo se implementa en la máquina de Turing. [32] Una descripción de la implementación describe la manera general en que la máquina mueve su cabeza y almacena datos para llevar a cabo el algoritmo, pero no proporciona estados exactos. [32] Con el mayor detalle, una descripción formal proporciona la tabla de estados exacta y la lista de transiciones de la máquina de Turing. [32]

Representación de diagrama de flujo

La ayuda gráfica llamada diagrama de flujo ofrece una manera de describir y documentar un algoritmo (y un programa de computadora correspondiente a él). Al igual que el flujo del programa de una máquina Minsky, un diagrama de flujo siempre comienza en la parte superior de una página y continúa hacia abajo. Sus símbolos principales son sólo cuatro: la flecha dirigida que muestra el flujo del programa, el rectángulo (SECUENCIA, GOTO), el diamante (SI-ENTONCES-ELSE) y el punto (OR-empate). Las estructuras canónicas de Böhm-Jacopini están hechas de estas formas primitivas. Las subestructuras pueden "anidar" en rectángulos, pero sólo si se produce una única salida desde la superestructura. Los símbolos y su uso para construir las estructuras canónicas se muestran en el diagrama. [33]

Análisis algorítmico

Con frecuencia es importante saber qué cantidad de un recurso particular (como tiempo o almacenamiento) se requiere teóricamente para un algoritmo determinado. Se han desarrollado métodos para el análisis de algoritmos para obtener respuestas cuantitativas (estimaciones); por ejemplo, un algoritmo que suma los elementos de una lista de n números tendría un requisito de tiempo de , utilizando la notación O grande . En todo momento el algoritmo sólo necesita recordar dos valores: la suma de todos los elementos hasta el momento y su posición actual en la lista de entrada. Por lo tanto, se dice que tiene un requisito de espacio de , si no se cuenta el espacio requerido para almacenar los números de entrada, o si se cuenta.

Diferentes algoritmos pueden completar la misma tarea con un conjunto diferente de instrucciones en menos o más tiempo, espacio o " esfuerzo " que otros. Por ejemplo, un algoritmo de búsqueda binaria (con costo ) supera a una búsqueda secuencial (costo ) cuando se usa para búsquedas de tablas en listas o matrices ordenadas.

Formal versus empírico

El análisis y estudio de algoritmos es una disciplina de la informática y, a menudo, se practica de forma abstracta sin el uso de un lenguaje o implementación de programación específica. En este sentido, el análisis de algoritmos se parece a otras disciplinas matemáticas en que se centra en las propiedades subyacentes del algoritmo y no en los detalles de una implementación particular. Normalmente, el pseudocódigo se utiliza para el análisis, ya que es la representación más simple y general. Sin embargo, en última instancia, la mayoría de los algoritmos generalmente se implementan en plataformas de hardware/software particulares y su eficiencia algorítmica eventualmente se pone a prueba utilizando código real. Para la solución de un problema "único", la eficiencia de un algoritmo particular puede no tener consecuencias significativas (a menos que n sea extremadamente grande), pero para algoritmos diseñados para un uso científico interactivo, comercial o de larga duración puede ser fundamental. Escalar de n pequeño a n grande frecuentemente expone algoritmos ineficientes que de otro modo serían benignos.

Las pruebas empíricas son útiles porque pueden descubrir interacciones inesperadas que afectan el rendimiento. Se pueden utilizar puntos de referencia para comparar antes/después de posibles mejoras en un algoritmo después de la optimización del programa. Sin embargo, las pruebas empíricas no pueden reemplazar el análisis formal y no es trivial realizarlas de manera justa. [34]

Eficiencia de ejecución

Para ilustrar las posibles mejoras posibles incluso en algoritmos bien establecidos, una importante innovación reciente, relacionada con los algoritmos FFT (muy utilizados en el campo del procesamiento de imágenes), puede reducir el tiempo de procesamiento hasta 1000 veces para aplicaciones como imágenes médicas. [35] En general, las mejoras de velocidad dependen de propiedades especiales del problema, que son muy comunes en aplicaciones prácticas. [36] Las aceleraciones de esta magnitud permiten que los dispositivos informáticos que hacen un uso extensivo del procesamiento de imágenes (como cámaras digitales y equipos médicos) consuman menos energía.

Diseño

El diseño de algoritmos se refiere a un método o proceso matemático para la resolución de problemas y la ingeniería de algoritmos. El diseño de algoritmos forma parte de muchas teorías de solución, como la programación dinámica o divide y vencerás dentro de la investigación operativa . Las técnicas para diseñar e implementar diseños de algoritmos también se denominan patrones de diseño de algoritmos, [37] con ejemplos que incluyen el patrón de método de plantilla y el patrón decorador. Uno de los aspectos más importantes del diseño de algoritmos es la eficiencia de los recursos (tiempo de ejecución, uso de memoria); la notación O grande se utiliza para describir, por ejemplo, el crecimiento del tiempo de ejecución de un algoritmo a medida que aumenta el tamaño de su entrada. [38]

Programación estructurada

Según la tesis de Church-Turing , cualquier algoritmo puede calcularse mediante un modelo que se sabe que es Turing completo . De hecho, se ha demostrado que la integridad de Turing requiere sólo cuatro tipos de instrucciones: GOTO condicional, GOTO incondicional, asignación y HALT. Sin embargo, Kemeny y Kurtz observan que, si bien el uso "indisciplinado" de GOTO incondicionales y GOTO condicionales SI-ENTONCES puede dar como resultado un " código espagueti ", un programador puede escribir programas estructurados utilizando sólo estas instrucciones; por otro lado "también es posible, y no demasiado difícil, escribir programas mal estructurados en un lenguaje estructurado". [39] Tausworthe aumenta las tres estructuras canónicas de Böhm-Jacopini : [40] SECUENCIA, SI-ENTONCES-ELSE y MIENTRAS-HACER, con dos más: HACER MIENTRAS y CASO. [41] Un beneficio adicional de un programa estructurado es que se presta a pruebas de corrección mediante inducción matemática . [42]

Clasificación

Hay varias formas de clasificar los algoritmos, cada una con sus propias ventajas.

Por implementación

Una forma de clasificar los algoritmos es mediante métodos de implementación.

recursividad
Un algoritmo recursivo es aquel que se invoca (hace referencia) a sí mismo repetidamente hasta que una determinada condición (también conocida como condición de terminación) coincide, lo cual es un método común a la programación funcional . Los algoritmos iterativos utilizan construcciones repetitivas como bucles y, a veces, estructuras de datos adicionales como pilas para resolver los problemas dados. Algunos problemas son naturalmente adecuados para una implementación u otra. Por ejemplo, las torres de Hanoi se entienden bien mediante una implementación recursiva. Cada versión recursiva tiene una versión iterativa equivalente (pero posiblemente más o menos compleja), y viceversa.
Serial, paralelo o distribuido
Los algoritmos generalmente se analizan bajo el supuesto de que las computadoras ejecutan una instrucción de un algoritmo a la vez. A esas computadoras a veces se les llama computadoras en serie. Un algoritmo diseñado para dicho entorno se denomina algoritmo en serie, a diferencia de los algoritmos paralelos o algoritmos distribuidos . Los algoritmos paralelos son algoritmos que aprovechan las arquitecturas informáticas en las que varios procesadores pueden trabajar en un problema al mismo tiempo. Los algoritmos distribuidos son algoritmos que utilizan varias máquinas conectadas a una red informática. Los algoritmos paralelos y distribuidos dividen el problema en subproblemas más simétricos o asimétricos y recopilan los resultados nuevamente. Por ejemplo, una CPU sería un ejemplo de algoritmo paralelo. El consumo de recursos en tales algoritmos no es solo los ciclos de procesador en cada procesador sino también la sobrecarga de comunicación entre los procesadores. Algunos algoritmos de clasificación se pueden paralelizar de manera eficiente, pero su sobrecarga de comunicación es costosa. Los algoritmos iterativos generalmente son paralelizables, pero algunos problemas no tienen algoritmos paralelos y se denominan problemas inherentemente seriales.
Determinista o no determinista
Los algoritmos deterministas resuelven el problema con una decisión exacta en cada paso del algoritmo, mientras que los algoritmos no deterministas resuelven los problemas mediante conjeturas, aunque las conjeturas típicas se vuelven más precisas mediante el uso de heurísticas .
Exacto o aproximado
Si bien muchos algoritmos alcanzan una solución exacta, los algoritmos de aproximación buscan una aproximación que se acerque más a la solución verdadera. La aproximación se puede alcanzar utilizando una estrategia determinista o aleatoria. Estos algoritmos tienen valor práctico para muchos problemas difíciles. Uno de los ejemplos de algoritmo aproximado es el problema de la mochila , donde hay un conjunto de elementos dados. Su objetivo es empacar la mochila para obtener el máximo valor total. Cada artículo tiene un peso y un valor. El peso total que se puede transportar no es más que un número fijo X. Por lo tanto, la solución debe considerar el peso de los artículos así como su valor. [43]
Algoritmo cuántico
Los algoritmos cuánticos se ejecutan en un modelo realista de computación cuántica . El término se utiliza habitualmente para aquellos algoritmos que parecen inherentemente cuánticos o que utilizan alguna característica esencial de la computación cuántica, como la superposición cuántica o el entrelazamiento cuántico .

Por paradigma de diseño

Otra forma de clasificar los algoritmos es por su metodología o paradigma de diseño . Existe una cierta cantidad de paradigmas, cada uno diferente del otro. Además, cada una de estas categorías incluye muchos tipos diferentes de algoritmos. Algunos paradigmas comunes son:

Fuerza bruta o búsqueda exhaustiva
La fuerza bruta es un método de resolución de problemas que implica probar sistemáticamente todas las opciones posibles hasta encontrar la solución óptima. Este enfoque puede llevar mucho tiempo, ya que requiere analizar todas las combinaciones posibles de variables. Sin embargo, a menudo se utiliza cuando otros métodos no están disponibles o son demasiado complejos. La fuerza bruta se puede utilizar para resolver una variedad de problemas, incluido encontrar el camino más corto entre dos puntos y descifrar contraseñas.
Divide y conquistaras
Un algoritmo de divide y vencerás reduce repetidamente una instancia de un problema a una o más instancias más pequeñas del mismo problema (generalmente de forma recursiva ) hasta que las instancias son lo suficientemente pequeñas como para resolverlas fácilmente. Un ejemplo de divide y vencerás es la clasificación por fusión . La clasificación se puede realizar en cada segmento de datos después de dividir los datos en segmentos y la clasificación de datos completos se puede obtener en la fase de conquista fusionando los segmentos. Una variante más simple de divide y vencerás se llama algoritmo de disminuir y vencer , que resuelve un subproblema idéntico y utiliza la solución de este subproblema para resolver el problema mayor. Divide y vencerás divide el problema en múltiples subproblemas, por lo que la etapa de conquista es más compleja que los algoritmos de disminución y conquista. Un ejemplo de algoritmo de disminución y conquista es el algoritmo de búsqueda binaria .
Búsqueda y enumeración
Muchos problemas (como jugar al ajedrez ) se pueden modelar como problemas en gráficos . Un algoritmo de exploración de gráficos especifica reglas para moverse por un gráfico y es útil para este tipo de problemas. Esta categoría también incluye algoritmos de búsqueda , enumeración de ramas y límites y retroceso .
Algoritmo aleatorio
Estos algoritmos toman algunas decisiones de forma aleatoria (o pseudoaleatoria). Pueden resultar muy útiles para encontrar soluciones aproximadas a problemas en los que encontrar soluciones exactas puede resultar poco práctico (consulte el método heurístico a continuación). Para algunos de estos problemas, se sabe que las aproximaciones más rápidas deben implicar cierta aleatoriedad . [44] Si los algoritmos aleatorios con complejidad de tiempo polinomial pueden ser el algoritmo más rápido para algunos problemas es una pregunta abierta conocida como el problema P versus NP . Hay dos grandes clases de tales algoritmos:
  1. Los algoritmos de Monte Carlo devuelven una respuesta correcta con alta probabilidad. Por ejemplo, RP es la subclase de estos que se ejecutan en tiempo polinomial .
  2. Los algoritmos de Las Vegas siempre devuelven la respuesta correcta, pero su tiempo de ejecución sólo está limitado probabilísticamente, por ejemplo, ZPP .
Reducción de la complejidad
Esta técnica implica resolver un problema difícil transformándolo en un problema mejor conocido para el cual tenemos (con suerte) algoritmos asintóticamente óptimos . El objetivo es encontrar un algoritmo reductor cuya complejidad no esté dominada por la del algoritmo reducido resultante. Por ejemplo, un algoritmo de selección para encontrar la mediana en una lista no ordenada implica primero ordenar la lista (la parte cara) y luego extraer el elemento central de la lista ordenada (la parte barata). Esta técnica también se conoce como transformar y conquistar .
Seguimiento hacia atrás
En este enfoque, se crean múltiples soluciones de forma incremental y se abandonan cuando se determina que no pueden conducir a una solución completa válida.

Problemas de optimización

Para problemas de optimización existe una clasificación de algoritmos más específica; un algoritmo para tales problemas puede caer en una o más de las categorías generales descritas anteriormente, así como en una de las siguientes:

Programación lineal
Cuando se buscan soluciones óptimas para una función lineal sujeta a restricciones de igualdad y desigualdad lineal, las restricciones del problema se pueden utilizar directamente para producir las soluciones óptimas. Existen algoritmos que pueden resolver cualquier problema de esta categoría, como el popular algoritmo simplex . [45] Los problemas que se pueden resolver con programación lineal incluyen el problema de flujo máximo para gráficos dirigidos. Si un problema requiere además que una o más de las incógnitas sean un número entero, entonces se clasifica en programación entera . Un algoritmo de programación lineal puede resolver tal problema si se puede demostrar que todas las restricciones para valores enteros son superficiales, es decir, las soluciones satisfacen estas restricciones de todos modos. En el caso general se utiliza un algoritmo especializado o un algoritmo que encuentra soluciones aproximadas, dependiendo de la dificultad del problema.
Programación dinámica
Cuando un problema muestra subestructuras óptimas (lo que significa que la solución óptima a un problema se puede construir a partir de soluciones óptimas a subproblemas) y subproblemas superpuestos , lo que significa que los mismos subproblemas se utilizan para resolver muchas instancias de problemas diferentes, un enfoque más rápido llamado programación dinámica evita volver a calcular soluciones que ya han sido computados. Por ejemplo, en el algoritmo de Floyd-Warshall , el camino más corto hacia una meta desde un vértice en un gráfico ponderado se puede encontrar utilizando el camino más corto hacia la meta desde todos los vértices adyacentes. La programación dinámica y la memorización van de la mano. La principal diferencia entre programación dinámica y divide y conquistarás es que los subproblemas son más o menos independientes en divide y vencerás, mientras que los subproblemas se superponen en la programación dinámica. La diferencia entre la programación dinámica y la recursividad sencilla está en el almacenamiento en caché o la memorización de llamadas recursivas. Cuando los subproblemas son independientes y no hay repetición, la memorización no ayuda; por tanto, la programación dinámica no es una solución para todos los problemas complejos. Al utilizar la memorización o mantener una tabla de subproblemas ya resueltos, la programación dinámica reduce la naturaleza exponencial de muchos problemas a una complejidad polinómica.
El método codicioso
Un algoritmo codicioso es similar a un algoritmo de programación dinámica en que funciona examinando subestructuras, en este caso no del problema sino de una solución dada. Dichos algoritmos comienzan con alguna solución, que puede estar dada o haber sido construida de alguna manera, y la mejoran haciendo pequeñas modificaciones. Para algunos problemas pueden encontrar la solución óptima mientras que para otros se detienen en los óptimos locales , es decir, en soluciones que el algoritmo no puede mejorar pero que no son óptimas. El uso más popular de los algoritmos codiciosos es encontrar el árbol de expansión mínimo donde es posible encontrar la solución óptima con este método. Huffman Tree , Kruskal , Prim y Sollin son algoritmos codiciosos que pueden resolver este problema de optimización.
El método heurístico
En los problemas de optimización , se pueden utilizar algoritmos heurísticos para encontrar una solución cercana a la solución óptima en los casos en que encontrar la solución óptima no sea práctico. Estos algoritmos funcionan acercándose cada vez más a la solución óptima a medida que avanzan. En principio, si se ejecutan durante un tiempo infinito, encontrarán la solución óptima. Su mérito es que pueden encontrar una solución muy cercana a la solución óptima en un tiempo relativamente corto. Dichos algoritmos incluyen búsqueda local , búsqueda tabú , recocido simulado y algoritmos genéticos . Algunos de ellos, como el recocido simulado, son algoritmos no deterministas, mientras que otros, como la búsqueda tabú, son deterministas. Cuando se conoce un límite en el error de la solución no óptima, el algoritmo se clasifica además como algoritmo de aproximación .

Estatus legal

Los algoritmos, por sí solos, no suelen ser patentables. En los Estados Unidos, una reivindicación que consiste únicamente en simples manipulaciones de conceptos, números o señales abstractos no constituye "procesos" (USPTO 2006), por lo que los algoritmos no son patentables (como en Gottschalk v. Benson ). Sin embargo, las aplicaciones prácticas de los algoritmos a veces son patentables. Por ejemplo, en Diamond v. Diehr , se consideró patentable la aplicación de un algoritmo de retroalimentación simple para ayudar en el curado del caucho sintético . Las patentes de software son controvertidas [46] y hay patentes criticadas que involucran algoritmos, especialmente algoritmos de compresión de datos , como la patente LZW de Unisys . Además, algunos algoritmos criptográficos tienen restricciones de exportación (ver exportación de criptografía ).

Ejemplos

Uno de los algoritmos más simples es encontrar el número más grande en una lista de números de orden aleatorio. Encontrar la solución requiere mirar todos los números de la lista. De esto se sigue un algoritmo simple, que puede expresarse en una descripción de alto nivel en prosa inglesa, como:

Descripción de alto nivel:

  1. Si no hay números en el conjunto, entonces no existe el número más alto.
  2. Suponga que el primer número del conjunto es el número más grande del conjunto.
  3. Para cada número restante del conjunto: si este número es mayor que el número más grande actual, considere que este número es el número más grande del conjunto.
  4. Cuando no queden números en el conjunto para iterar, considere que el número más grande actual es el número más grande del conjunto.

Descripción (cuasi) formal: escrita en prosa pero mucho más cercana al lenguaje de alto nivel de un programa de computadora, la siguiente es la codificación más formal del algoritmo en pseudocódigo o código pidgin :

Algoritmo Número más grandeEntrada: una lista de números L .Salida: El número más grande de la lista L.
si  L.size = 0 devuelve nulo el más grandeL [0] para cada  elemento  en  L , hazlo  si  el elemento > más grande , entonces  el elemento más grandedevuelve el más grande 

Ver también

Notas

  1. ^ ab "Definición de ALGORITMO". Diccionario en línea Merriam-Webster . Archivado desde el original el 14 de febrero de 2020 . Consultado el 14 de noviembre de 2019 .
  2. ^ ab Blair, Ann, Duguid, Paul, Goeing, Anja-Silvia y Grafton, Anthony. Información: Un compañero histórico, Princeton: Princeton University Press, 2021. p. 247
  3. ^ ab David A. Grossman, Ophir Frieder, Recuperación de información: algoritmos y heurística , segunda edición, 2004, ISBN 1402030045 
  4. ^ ab "Cualquier algoritmo matemático clásico, por ejemplo, se puede describir con un número finito de palabras en inglés" (Rogers 1987:2).
  5. ^ ab Bien definido con respecto al agente que ejecuta el algoritmo: "Existe un agente informático, generalmente humano, que puede reaccionar a las instrucciones y realizar los cálculos" (Rogers 1987:2).
  6. ^ "un algoritmo es un procedimiento para calcular una función (con respecto a alguna notación elegida para números enteros)... esta limitación (a funciones numéricas) no produce pérdida de generalidad", (Rogers 1987:1).
  7. ^ "Un algoritmo tiene cero o más entradas, es decir, cantidades que se le dan inicialmente antes de que comience el algoritmo" (Knuth 1973:5).
  8. ^ "Un procedimiento que tiene todas las características de un algoritmo, excepto que posiblemente carezca de finitud, puede denominarse 'método computacional ' " (Knuth 1973:5).
  9. ^ "Un algoritmo tiene una o más salidas, es decir, cantidades que tienen una relación específica con las entradas" (Knuth 1973:5).
  10. ^ Es discutible si un proceso con procesos internos aleatorios (sin incluir la entrada) es o no un algoritmo. Rogers opina que: "un cálculo se lleva a cabo de forma discreta y gradual, sin el uso de métodos continuos o dispositivos analógicos... llevado a cabo de forma determinista, sin recurrir a métodos o dispositivos aleatorios, por ejemplo, dados" (Rogers 1987:2) .
  11. ^ Piedra 1973:4
  12. ^ Simanowski, Roberto (2018). El algoritmo de la muerte y otros dilemas digitales. Meditaciones intempestivas. vol. 14. Traducido por Chase, Jefferson. Cambridge, Massachusetts: MIT Press. pag. 147.ISBN 9780262536370. Archivado desde el original el 22 de diciembre de 2019 . Consultado el 27 de mayo de 2019 . [...] siguiente nivel de abstracción de la burocracia central: algoritmos que operan globalmente.
  13. ^ Dietrich, Eric (1999). "Algoritmo". En Wilson, Robert Andrew; Keil, Frank C. (eds.). La Enciclopedia de Ciencias Cognitivas del MIT. Biblioteca MIT Cognet. Cambridge, Massachusetts: MIT Press (publicado en 2001). pag. 11.ISBN 9780262731447. Consultado el 22 de julio de 2020 . Un algoritmo es una receta, método o técnica para hacer algo.
  14. ^ Stone requiere que "debe terminar en un número finito de pasos" (Stone 1973: 7–8).
  15. ^ Boolos y Jeffrey 1974,1999:19
  16. ^ abc Chabert, Jean-Luc (2012). Una historia de los algoritmos: del guijarro al microchip . Medios de ciencia y negocios de Springer. págs. 7–8. ISBN 9783642181924.
  17. ^ ab Sriram, MS (2005). "Algoritmos en matemáticas indias". En Emch, Gerard G.; Sridharan, R.; Srinivas, MD (eds.). Contribuciones a la historia de las matemáticas indias . Saltador. pag. 153.ISBN 978-93-86279-25-5.
  18. ^ Hayashi, T. (2023, 1 de enero). Brahmagupta. Enciclopedia Británica.
  19. ^ abc Cooke, Roger L. (2005). La historia de las matemáticas: un curso breve . John Wiley e hijos. ISBN 978-1-118-46029-0.
  20. ^ ab Dooley, John F. (2013). Una breve historia de la criptología y los algoritmos criptográficos . Medios de ciencia y negocios de Springer. págs. 12-3. ISBN 9783319016283.
  21. ^ Knuth, Donald E. (1972). "Algoritmos babilónicos antiguos" (PDF) . Comunitario. ACM . 15 (7): 671–677. doi :10.1145/361454.361514. ISSN  0001-0782. S2CID  7829945. Archivado desde el original (PDF) el 24 de diciembre de 2012.
  22. ^ Aaboe, Asger (2001). Episodios de la Historia Temprana de la Astronomía . Nueva York: Springer. págs. 40–62. ISBN 978-0-387-95136-2.
  23. ^ Ast, Courtney. "Eratóstenes". Universidad Estatal de Wichita: Departamento de Matemáticas y Estadística. Archivado desde el original el 27 de febrero de 2015 . Consultado el 27 de febrero de 2015 .
  24. ^ Bólter 1984:24
  25. ^ Bólter 1984:26
  26. ^ Bólter 1984: 33–34, 204–206.
  27. ^ Diagrama de Bell y Newell 1971:39, cf. Davis 2000
  28. ^ * Melina Hill, corresponsal de Valley News, Un tinkerer consigue un lugar en la historia , Valley News West Lebanon NH, jueves 31 de marzo de 1983, p. 13.
  29. ^ Davis 2000:14
  30. ^ Kleene 1943 en Davis 1965:274
  31. ^ Rosser 1939 en Davis 1965:225
  32. ^ abcd Sipser 2006:157
  33. ^ véase Tausworthe 1977
  34. ^ Kriegel, Hans-Peter ; Schubert, Erich; Zimek, Arthur (2016). "El arte (negro) de la evaluación en tiempo de ejecución: ¿estamos comparando algoritmos o implementaciones?". Sistemas de Conocimiento y Información . 52 (2): 341–378. doi :10.1007/s10115-016-1004-2. ISSN  0219-1377. S2CID  40772241.
  35. ^ Gillian Conahan (enero de 2013). "Unas mejores matemáticas generan redes de datos más rápidas". descubrirmagazine.com. Archivado desde el original el 13 de mayo de 2014 . Consultado el 13 de mayo de 2014 .
  36. ^ Haitham Hassanieh, Piotr Indyk , Dina Katabi y Eric Price, "Simposio ACM-SIAM sobre algoritmos discretos (SODA) Archivado el 4 de julio de 2013 en Wayback Machine , Kioto, enero de 2012. Véase también la página web de sFFT archivada el 21 de febrero , 2012, en Wayback Machine .
  37. ^ Goodrich, Michael T .; Tamassia, Roberto (2002). Diseño de algoritmos: fundamentos, análisis y ejemplos de Internet. John Wiley & Sons, Inc. ISBN 978-0-471-38365-9. Archivado desde el original el 28 de abril de 2015 . Consultado el 14 de junio de 2018 .
  38. ^ "Notación O grande (artículo) | Algoritmos". Academia Khan . Consultado el 3 de junio de 2024 .
  39. ^ John G. Kemeny y Thomas E. Kurtz 1985 Regreso a lo básico: la historia, la corrupción y el futuro del idioma , Addison-Wesley Publishing Company, Inc. Reading, MA, ISBN 0-201-13433-0
  40. ^ Tausworthe 1977:101
  41. ^ Tausworthe 1977:142
  42. ^ Knuth 1973 sección 1.2.1, ampliada por Tausworthe 1977 en las páginas 100 y siguientes y capítulo 9.1
  43. ^ Kellerer, Hans; Pferschy, Ulrich; Pisinger, David (2004). Problemas con la mochila | Hans Kellerer | Saltador. Saltador. doi :10.1007/978-3-540-24777-7. ISBN 978-3-540-40286-2. S2CID  28836720. Archivado desde el original el 18 de octubre de 2017 . Consultado el 19 de septiembre de 2017 .
  44. ^ Por ejemplo, el volumen de un politopo convexo (descrito mediante un oráculo de membresía) se puede aproximar con gran precisión mediante un algoritmo de tiempo polinomial aleatorio, pero no mediante uno determinista: ver Dyer, Martin; Friso, Alan; Kannan, Ravi (enero de 1991). "Un algoritmo aleatorio de tiempo polinómico para aproximar el volumen de cuerpos convexos". J. ACM . 38 (1): 1–17. CiteSeerX 10.1.1.145.4600 . doi :10.1145/102782.102783. S2CID  13268711. 
  45. ^ George B. Dantzig y Mukund N. Thapa. 2003. Programación lineal 2: Teoría y Extensiones . Springer-Verlag.
  46. ^ "Los expertos: ¿El sistema de patentes fomenta la innovación?". El periodico de Wall Street . 16 de mayo de 2013. ISSN  0099-9660 . Consultado el 29 de marzo de 2017 .

Bibliografía

Otras lecturas

enlaces externos

Repositorios de algoritmos