Si y no. Depende de las restricciones que desea cumplir y las condiciones previas necesarias para ejecutar su algoritmo.
Idealmente, un algoritmo es una receta abstracta que define paso a paso cómo hacer algo. Los algoritmos se definieron así con el objetivo de reproducibilidad y posterior automatización. Los algoritmos se originan del cálculo lambda, por lo que puede ver fácilmente por qué están hechos de esa manera. Esta definición es la habitual, pero los algoritmos modernos pueden ser no secuenciales (no paso a paso, como los algoritmos concurrentes, o lógicos como los que usan la unificación), no lineales (algoritmos estocásticos) o simplemente extraños (cuánticos algoritmos), pero lo pasaré.
Por lo tanto, idealmente, un algoritmo debe ser lo más abstracto posible sin tener en cuenta ningún hardware.
Pero, como con cualquier sistema, debe definir algunos axiomas , no solo para obtener un sistema coherente, sino también para ganar tiempo. Por ejemplo, la mayoría de los algoritmos suponen, al menos implícitamente, que están definidos en una máquina de Von-Neumann. Si ese no fuera el caso, tendrían que definir explícitamente cada parte del sistema en el que deben ejecutarse (ya que esto es necesario para reproducir la receta, esta es una especie de condición previa). Además, a menudo los algoritmos se basan en comandos comunes como write () sin definirlos completamente.
Otra razón por la cual los algoritmos no son tan abstractos de la arquitectura de hardware, es cuando necesita cumplir algunas restricciones .
Digamos que está trabajando en sistemas integrados, entonces probablemente no puede confiar en la misma cantidad de recursos que tiene en las estaciones de trabajo. Uno de los recursos más restringidos es probablemente la memoria. Sin embargo, la mayoría de los algoritmos tienden a optimizar la complejidad del tiempo (velocidad de ejecución en la CPU), no la complejidad de la memoria (cantidad de memoria necesaria para trabajar en los datos). Para estos sistemas, se han ideado algoritmos de memoria optimizada donde los algoritmos sin memoria optimizados simplemente fallarían o funcionarían mucho más lentamente. De hecho, los sistemas embebidos no son el único objetivo de los algoritmos de memoria eficiente: por ejemplo, existen algoritmos ajenos a la caché que adaptan su procesamiento para usar eficientemente la caché de la CPU. Otro ejemplo: algunos algoritmos de aprendizaje automático para big data están diseñados paraaprendizaje incremental o computación fuera del núcleo para procesar una gran cantidad de datos mucho más grande que la memoria disponible en cualquier computadora, etc.
También hay algoritmos que no optimizan una parte específica de la computadora, sino un estándar que depende de la arquitectura del hardware. Por ejemplo, los datos numéricos que necesitan precisión se almacenan dentro de flotante o doble, que por naturaleza están limitados debido a los límites de hardware. El problema es que los cálculos complejos pueden conducir al redondeo, y cuantos más cálculos haga sobre números redondeados, más se desviará. Esto se llama una interferencia catastrófica . Algunas aplicaciones necesitan una precisión crítica, incluso a costa de la peor complejidad. Para este tipo de aplicaciones, se realizaron algoritmos que optimizan sus cálculos para reducir o eliminar interferencias catastróficas.
Por lo tanto, diseñar un algoritmo también puede ser una compensación entre la abstracción y las restricciones.
Al final, podemos decir que un algoritmo es tan abstracto como su objetivo y según sus necesidades precondicionales (arquitectura) . Cuanto más específico sea el objetivo de su algoritmo, más probablemente dependerá de la arquitectura del hardware.
Algunas palabras clave relacionadas que pueden interesarle: