¿Por qué identificamos algoritmos que actúan en diferentes tamaños de entrada?

Existen muchos algoritmos que solo funcionan prácticamente en tamaños de entrada pequeños.

Cuando hablamos del tiempo de ejecución de un algoritmo (o complejidad de tiempo ), generalmente expresamos esto en notación “Big O”.

Un ejemplo simple de esto es la diferencia en tiempo de ejecución entre Mergesort y el tipo de inserción. Mergesort utiliza un método de división y conquista, por lo que duplicar el conjunto de entrada aumenta su tiempo de ejecución linealmente (es un poco más complejo que esto, pero tenga paciencia conmigo). Por lo tanto, Mergesort es O (n * log n). La ordenación por inserción no es un algoritmo tan inteligente y compara cada elemento con, en el peor de los casos, todos los demás elementos del conjunto de entrada. Por lo tanto, es O (n ^ 2).

Entonces, para responder a su pregunta, supongamos que tenemos un conjunto de 10 elementos que queremos clasificar. Ambos algoritmos funcionarán esencialmente en la misma cantidad de tiempo, porque el tamaño de la muestra es muy pequeño. Sin embargo, a medida que aumentamos nuestro conjunto de entrada, esto ya no es cierto. La clasificación de mil millones de elementos podría llevar horas y horas con la ordenación por inserción, pero tal vez minutos con la ordenación por fusión, como ejemplo.

Entonces sí. Hay algoritmos que son increíblemente poco prácticos a gran escala.


Q adicionales:

¿Por qué mergesort en 10 elementos y mergesort en 11 elementos se tratan como el mismo algoritmo?

Porque simples son el mismo algoritmo. La entrada de mergesort es un conjunto arbitrariamente grande. Las operaciones realizadas en ese conjunto son las mismas, es decir, independientemente del tamaño de entrada. Un algoritmo es solo un conjunto de tareas ordenadas y específicas. En aras de una implementación sensata, la mayoría de los algoritmos son independientes del tamaño.

¿Por qué construimos algoritmos para que funcionen en diferentes tamaños de entrada?

Principalmente por razones prácticas. La ordenación por inserción es un algoritmo mucho más simple, por ejemplo, y no lleva mucho tiempo implementarlo.

Este argumento es un poco discutible porque muchos algoritmos están estandarizados en bibliotecas, pero el principal aún se mantiene. Usted diseña algoritmos a la escala para la que se usan. No es necesario invertir un tiempo valioso en la creación de un algoritmo escalable si solo se usa con conjuntos pequeños.

¿Hay alguna razón teórica para esto (por ejemplo, un teorema que establece que cada algoritmo se puede extender de manera significativa para un tamaño de entrada arbitrario) o existen algoritmos que funcionan solo en una longitud de entrada fija y no se pueden extender fácilmente?

No tengo una gran respuesta a esta pregunta, pero me interesaría un poco en el análisis de algoritmos y la complejidad del tiempo si está interesado. Hay una diferencia entre el diseño de algoritmos teóricos y la aplicación práctica de algoritmos. Caso en cuestión: Bogosort, que tiene el peor tiempo de ejecución de O ((n + 1)!) Podría usarse para clasificar 2 elementos o 2 mil millones de elementos. Algorítmicamente, no hay razón para que esto no funcione. Sin embargo, O ((n + 1)!) De 2 mil millones probablemente correría hasta literalmente el final del universo sin completarse. Ahí vas. Teóricamente, podría funcionar. Prácticamente, no es una oportunidad.

Ciertamente, existen algoritmos que solo funcionan en tamaños de entrada fijos. Todos los días, miles de programadores escriben funciones que toman algunos enteros de 32 bits sin signo como entrada, o una matriz de una longitud definida por una constante de tiempo de compilación u otros argumentos de tamaño fijo. Cada uno de estos es una implementación de un algoritmo.

Existen algoritmos para “ordenar una matriz de 11 elementos” que son distintos de los que “ordenan una matriz de 10 elementos”.

Ver ¿Qué es exactamente un algoritmo? ¿Qué califica como algoritmo?

Pero, para fines de diseño y análisis, generalmente estamos interesados ​​en resolver un problema sin poner una condición previa específica en el tamaño de la entrada. Es cierto que esta es una pretensión académica, ya que podríamos hablar de tamaños que exceden cualquier cálculo realizado físicamente. Pero en realidad es una suposición simplificadora que nos permite hablar sobre un objeto matemático en lugar de los detalles de una implementación, y produce un algoritmo de valor en una variedad más amplia de contextos y usos.

Por ejemplo, el modelo teórico principal de computación es la Máquina de Turing, que se define con una cinta infinita. Sería una restricción adicional decir que el tamaño de entrada es fijo o menor que alguna constante. De manera similar, la mayoría de las implementaciones de clasificación están limitadas en la práctica por la cantidad de memoria que se puede abordar, pero no vemos esto como una limitación fundamental del algoritmo que se implementa. El mismo código podría funcionar para una variedad de tamaños de palabras. (Sin embargo, como se analiza en la pregunta anterior, este es un concepto bastante sutil: a veces nos preocupa que un algoritmo se “implemente en una máquina de memoria de acceso aleatorio con tamaño de palabra N”, pero la mayoría de las veces no lo hacemos).

Otra razón para permitir la entrada de tamaño variable es eliminar soluciones que son “triviales” desde el punto de vista del diseño de algoritmos. Por ejemplo, si se garantizó que la entrada a una rutina de clasificación constara de solo 10 números de tamaño fijo, entonces podría tener una tabla que contenga todas las entradas posibles y devolver la versión ordenada en tiempo lineal (usando un hashing perfecto). Esto no es práctico. ni teóricamente interesante, pero cuando exigimos que un algoritmo acepte entradas ilimitadamente grandes, evitamos implícitamente tener que preocuparnos por tales casos.