Introducción
La clasificación es una operación esencial en informática que implica organizar elementos en un orden específico, como orden numérico o alfabético. Se han desarrollado varios algoritmos de clasificación, cada uno con indicadores de tiempo y eficiencia. La clasificación en tiempo lineal es un subconjunto de algoritmos de clasificación con una ventaja significativa: pueden ordenar un conjunto determinado de elementos en tiempo lineal, el tiempo de ejecución aumenta linealmente con el tamaño de entrada.
comparación de cadenas java
El algoritmo de clasificación en tiempo lineal más conocido es el de clasificación descendente. La clasificación computacional es particularmente eficiente cuando el rango de elementos de entrada es conocido y relativamente pequeño. Esto elimina la necesidad de comparar elementos, la principal operación que requiere mucho tiempo en muchos otros algoritmos de clasificación. Utilizando el conocimiento del dominio de entrada, la clasificación computacional logra una complejidad temporal lineal. Una clasificación numérica primero escanea la matriz de entrada para determinar el recuento de cada elemento. Luego utiliza estos números para calcular las posiciones correctas de los elementos en la tabla de resultados ordenados. El algoritmo consta de los siguientes pasos:
- Para determinar el rango, identifique los valores mínimo y máximo de la matriz de entrada.
- Cree una hoja de trabajo inicializada con el tamaño del rango y ceros.
- Itere sobre la matriz de entrada e incremente cada elemento encontrado.
- Modifique la hoja de trabajo calculando el total acumulado para obtener las posiciones correctas para cada elemento.
- Cree una matriz de salida del mismo tamaño que la matriz de entrada.
- Mueva la matriz de entrada nuevamente, colocando cada elemento en la posición correcta en la matriz de salida según la hoja de trabajo.
- La tabla de resultados ahora contiene elementos ordenados.
La principal ventaja de la ordenación descendente es que logra una complejidad temporal lineal de O(n), lo que la hace muy eficiente para tamaños de entrada grandes. Sin embargo, su aplicabilidad se limita a escenarios en los que la elección de los elementos de entrada se conoce de antemano y es relativamente pequeña.
Es importante señalar que otros algoritmos de clasificación, como la clasificación rápida o la combinación, normalmente tienen una complejidad temporal de O (n log n), que se considera eficiente para muchas aplicaciones prácticas. Los algoritmos de clasificación en tiempo lineal, como la clasificación numérica, proporcionan una alternativa cuando ciertas restricciones o propiedades de la entrada permiten utilizar la complejidad del tiempo lineal.
Historia
Los algoritmos de clasificación en tiempo lineal tienen una rica historia en informática. El desarrollo del orden del tiempo lineal se remonta a mediados del siglo XX y las contribuciones de científicos y matemáticos fueron significativas. Uno de los primeros algoritmos de clasificación en tiempo lineal es la clasificación por cubetas, propuesta por Harold H. Seward en 1954. Una clasificación con cubetas divide los elementos de entrada en un número finito de cubetas y luego clasifica cada cubeta por separado. Este algoritmo tiene complejidad temporal lineal si la distribución de los elementos de entrada es relativamente uniforme.
En 1959, Kenneth E. Iverson introdujo un algoritmo de base que logra una complejidad de tiempo lineal. Radix clasifica los elementos por sus números o signos, del menos significativo al más significativo. Utiliza algoritmos de clasificación sólidos, como la clasificación numérica o por cubos, para ordenar los elementos en la ubicación de cada dígito. La clasificación por radix se hizo popular en la era de las tarjetas perforadas y los primeros sistemas informáticos. Sin embargo, el algoritmo de clasificación de tiempo lineal más conocido es una enumeración, introducida por Harold H. Seward y Peter Elias en 1954 y posteriormente redescubierta de forma independiente por Harold H. 'Bobby' Johnson en 1961. La clasificación numérica ha recibido considerable atención.
Esto es particularmente eficaz cuando la gama de elementos de entrada es conocida y relativamente pequeña. La historia de la clasificación temporal lineal continuó con el desarrollo de otros algoritmos especializados. Por ejemplo, en 1987, Hanan Samet propuso la clasificación de árboles de distribución binaria, un algoritmo de clasificación de tiempo lineal para datos multidimensionales. A lo largo de los años, los investigadores han seguido estudiando y mejorando los algoritmos de programación lineal, centrándose en escenarios y restricciones específicos. Aunque algoritmos como la clasificación rápida y la combinación se utilizan más ampliamente por su eficiencia en más escenarios, los algoritmos de clasificación en tiempo lineal proporcionan alternativas valiosas cuando ciertas circunstancias permiten explotar la complejidad del tiempo lineal. En general, la historia de la clasificación en tiempo lineal se caracteriza por la búsqueda de algoritmos eficientes que puedan ordenar grandes conjuntos de datos en tiempo lineal, superando las limitaciones de los algoritmos de clasificación basados en comparaciones. Las contribuciones de varios investigadores allanaron el camino para desarrollar y comprender estas técnicas de clasificación especializadas.
Tipos de clasificación de tiempo lineal
Existen varios algoritmos diferentes de clasificación de tiempo lineal. Los dos tipos principales son los algoritmos basados en recuentos y los algoritmos basados en bases. Estos son los algoritmos de clasificación de tiempo lineal más comunes, clasificados según los siguientes tipos:
Algoritmos basados en conteo
Algoritmos basados en Radix
Ventajas de la clasificación por tiempo lineal
Los algoritmos de clasificación en tiempo lineal, como la clasificación numérica, ofrecen varias ventajas en escenarios específicos.
Desventajas de la clasificación por tiempo lineal
Aunque los algoritmos de programación lineal tienen sus ventajas, también tienen ciertas limitaciones y desventajas:
Al elegir un algoritmo de clasificación, es esencial considerar cuidadosamente las características específicas de los datos de entrada y los requisitos del problema de clasificación. Si bien los algoritmos de programación lineal ofrecen ventajas en escenarios específicos, sólo en ocasiones son la opción más apropiada o eficiente.
Aplicaciones de algoritmos de clasificación de tiempo lineal.
Los algoritmos de clasificación en tiempo lineal son eficientes y tienen muchas aplicaciones en diversos campos. A continuación se muestran algunas aplicaciones típicas del orden temporal lineal:
Implementación de clasificación de tiempo lineal en C++
A continuación se muestra un ejemplo de un programa que implementa Counting Sort, que es un algoritmo de clasificación de tiempo lineal:
#include #include using namespace std; void countingSort(vector& arr) { // Find the maximum element in the array int max_val = *max_element(arr.begin(), arr.end()); // Create a count array to store the count of each element vector count(max_val + 1, 0); // Count the occurrences of each element for (int num : arr) { count[num]++; } // Compute the prefix sum for (int i = 1; i <count.size(); i++) { count[i] +="count[i" - 1]; } create a sorted output array vector output(arr.size()); place the elements in order for (int i="arr.size()" 1;>= 0; i--) { output[count[arr[i]] - 1] = arr[i]; count[arr[i]]--; } // Copy the sorted elements back to the original array for (int i = 0; i <arr.size(); i++) { arr[i]="output[i];" } int main() vector arr="{4," 2, 8, 3, 1}; sort the array using counting countingsort(arr); print sorted cout << 'sorted array: '; for (int num : arr) ' endl; return 0; < pre> <p> <strong>Sample Output</strong> </p> <pre> Sorted array: 1 2 2 3 3 4 8 </pre> <p>This indicates that the input array has been sorted in ascending order using the Counting Sort algorithm, resulting in the sorted array [1, 2, 2, 3, 3, 4, 8].</p> <p>In this C++ program, the counting sort function takes a reference to the vector arr and runs the counting sort routine. It finds the table's maximum value to determine the worksheet's size. It then counts each element's occurrence and calculates the worksheet's prefix sum. Then, it creates a result vector and puts the elements in order according to the worksheet. Finally, it copies the sorted elements back into the original array. In the primary function, the example array {4, 2, 2, 8, 3, 3, 1} is sorted by the enumeration sort algorithm and printed as a sorted matrix. Note that the program uses libraries to work with vectors and find the maximum element of an array using the max_element function.</p> <hr></arr.size();></count.size();>
Esto indica que la matriz de entrada se ha ordenado en orden ascendente utilizando el algoritmo de clasificación por conteo, lo que da como resultado la matriz ordenada [1, 2, 2, 3, 3, 4, 8].
En este programa C++, la función de clasificación por conteo toma una referencia al vector arr y ejecuta la rutina de clasificación por conteo. Encuentra el valor máximo de la tabla para determinar el tamaño de la hoja de trabajo. Luego cuenta la aparición de cada elemento y calcula la suma del prefijo de la hoja de trabajo. Luego, crea un vector de resultados y ordena los elementos según la hoja de trabajo. Finalmente, copia los elementos ordenados nuevamente en la matriz original. En la función principal, la matriz de ejemplo {4, 2, 2, 8, 3, 3, 1} se ordena mediante el algoritmo de clasificación por enumeración y se imprime como una matriz ordenada. Tenga en cuenta que el programa utiliza bibliotecas para trabajar con vectores y encontrar el elemento máximo de una matriz usando la función max_element.