logo

Clasificación de tiempo lineal

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:

  1. Para determinar el rango, identifique los valores mínimo y máximo de la matriz de entrada.
  2. Cree una hoja de trabajo inicializada con el tamaño del rango y ceros.
  3. Itere sobre la matriz de entrada e incremente cada elemento encontrado.
  4. Modifique la hoja de trabajo calculando el total acumulado para obtener las posiciones correctas para cada elemento.
  5. Cree una matriz de salida del mismo tamaño que la matriz de entrada.
  6. 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.
  7. La tabla de resultados ahora contiene elementos ordenados.
Clasificación de tiempo lineal

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

    Clasificación basada en conteo:Counting-Based es un algoritmo de clasificación no comparativo. Cuenta la aparición de cada elemento particular en la matriz de entrada y utiliza esta información para determinar la posición correcta de cada elemento en la matriz de salida ordenada. La clasificación basada en conteo supone que los elementos de entrada son números enteros o se pueden sumar a números enteros.

Algoritmos basados ​​en Radix

    Radix Suerte:Radix Sort es un algoritmo de clasificación no basado en comparación que clasifica elementos por sus números o caracteres. Cuenta cada número o signo en los elementos desde el número menos significativo hasta el más significativo. La clasificación radical supone que los elementos de entrada son números enteros o cadenas.Clasificación de cubo:Bucket Sort es una variante de Radix Sort que divide elementos en grupos fijos según su rango o distribución. Cada segmento se ordena por separado utilizando un algoritmo de clasificación diferente o mediante clasificación binaria recursiva.Clasificación de base MSD (dígito más significativo):MSD Radix Sort es una variante de Radix Sort que comienza a ordenar elementos según su valor más significativo. Divide recursivamente los elementos en subgrupos según el valor del número actual y aplica MSD Radix Sort a cada subgrupo hasta que se hayan contado todos los números.Clasificación de base de LSD (dígito menos significativo):LSD Radix Sort es otra variante que comienza a ordenar elementos según su valor menos significativo. Ordena recursivamente los elementos según cada número, desde el extremo derecho al extremo izquierdo, produciendo un resultado ordenado. Tanto los algoritmos de clasificación basados ​​en recuentos como los basados ​​en raíces logran una complejidad temporal lineal al explotar propiedades específicas de los elementos de entrada, como su rango o estructura representacional (por ejemplo, números o caracteres). Sin embargo, su aplicabilidad puede variar dependiendo de las características de los datos de entrada.

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.

    Eficiente para tamaños de entrada grandes:La complejidad temporal de los algoritmos de clasificación de tiempo lineal es O (n), lo que significa que el tiempo de ejecución aumenta linealmente con el tamaño de entrada. Esto los hace muy eficientes para grandes conjuntos de datos en comparación con los algoritmos de clasificación basados ​​en comparaciones, como los algoritmos de clasificación rápida o de combinación, que normalmente tienen una complejidad temporal de O (n log n).Sin operaciones de comparación:Los algoritmos de clasificación en tiempo lineal, como la clasificación por enumeración, no se basan en comparaciones elementales. En lugar de ello, utilizan atributos específicos o información sobre los elementos de entrada, como su extensión o distribución. Esta característica los hace ventajosos cuando el costo de comparación es alto, como para objetos complejos u operaciones de comparación costosas.Idoneidad para propiedades de entrada específicas:Los algoritmos de clasificación en tiempo lineal suelen tener requisitos o suposiciones específicas sobre los elementos de entrada. Por ejemplo, para calcular un orden de clasificación, es necesario conocer de antemano el rango de elementos de entrada. Cuando se cumplen estas condiciones, los algoritmos de clasificación en tiempo lineal pueden ofrecer importantes ventajas de rendimiento sobre los algoritmos de clasificación generales.Orden estable:Muchos algoritmos de clasificación en tiempo lineal, incluida la clasificación numérica y por base, son inherentemente estables. Coherencia significa que los elementos con claves o valores duplicados mantienen un orden relativo en la salida ordenada. Esto puede ser fundamental cuando se ordenan objetos o registros con múltiples atributos o cuando es esencial preservar el orden original de elementos de igual valor.Facilidad de uso:Los algoritmos de clasificación por tiempo lineal, como la clasificación por enumeración, suelen ser relativamente fáciles de implementar en comparación con algoritmos de clasificación basados ​​en comparaciones más complejos. Pueden ser más fáciles de entender y depurar, lo que los hace adecuados para situaciones en las que se desea simplicidad y claridad.

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:

    Restringir los requisitos de entrada:Los algoritmos de clasificación en tiempo lineal suelen tener requisitos o suposiciones específicas sobre los elementos de entrada. Por ejemplo, para calcular un orden de clasificación, es necesario conocer de antemano el rango de elementos de entrada. Esta restricción limita su aplicabilidad a situaciones en las que se cumplen estas condiciones. Los requisitos de memoria pueden resultar poco prácticos o exceder los recursos disponibles si el rango es extenso o desconocido.Requisitos de espacio adicionales:Algunos algoritmos de clasificación en tiempo lineal, como la clasificación numérica, requieren espacio adicional para almacenar otras matrices o estructuras de datos. El espacio requerido suele ser proporcional al número de elementos de entrada. Esto puede ser una desventaja cuando el uso de la memoria es un problema, especialmente cuando se trata de grandes conjuntos de datos o recursos de memoria limitados.Falta de versatilidad:Los algoritmos de clasificación de tiempo lineal son algoritmos especializados diseñados para escenarios o restricciones específicos. Es posible que deban ser más adecuados y eficientes para tareas generales de clasificación o diferentes distribuciones de entrada. Los algoritmos de clasificación basados ​​en comparaciones, como la clasificación rápida o la combinación, son más versátiles y pueden manejar una gama más amplia de rangos de entrada.Ineficiente para rangos pequeños o datos escasos:Los algoritmos de clasificación en tiempo lineal, como la enumeración, son más eficientes cuando el rango de elementos de entrada es pequeño y está densamente distribuido. Si el rango es extenso o los datos son escasos (es decir, solo unos pocos valores distintos), el algoritmo puede ahorrar tiempo y esfuerzo al procesar porciones vacías o escasamente pobladas del rango de entrada.Limitado a tipos de datos específicos:Los algoritmos de clasificación en tiempo lineal, como la clasificación por enumeración, están diseñados principalmente para ordenar números enteros no negativos u objetos de valor clave. Es posible que no sean adecuados para ordenar otros tipos de datos, como números de punto flotante, cadenas o estructuras de datos complejas. La adaptación de algoritmos de clasificación de tiempo lineal para manejar diferentes tipos de datos o funciones de comparación personalizadas puede requerir modificaciones o preprocesamiento adicionales.

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:

    Ordenar números enteros de rango pequeño:Los algoritmos de clasificación en tiempo lineal, como la clasificación por conteo y la clasificación por base, son ideales para ordenar matrices de números enteros cuando el rango de valores es. Estos algoritmos logran una complejidad de tiempo lineal al hacer suposiciones sobre los datos de entrada, lo que les permite evitar la clasificación basada en comparaciones.Clasificación de cadenas:También se pueden aplicar algoritmos de clasificación en tiempo lineal para clasificar cadenas de manera eficiente. Al tomar propiedades únicas de las cadenas, como su longitud o caracteres, algoritmos como Radix Sort pueden lograr una complejidad temporal lineal al clasificar cadenas.Funciones de la base de datos:La clasificación es una función esencial de los algoritmos de clasificación de tiempo lineal que pueden ordenar de manera eficiente grandes conjuntos de datos en función de columnas o campos específicos. Esto permite un procesamiento de consultas más rápido y un mejor rendimiento en las operaciones de la base de datos.Creando histogramas:Los histogramas son esenciales para diversas tareas estadísticas y de análisis de datos. Los algoritmos de clasificación de tiempo lineal, como la clasificación numérica, pueden generar histogramas contando de manera eficiente las apariciones de elementos en un conjunto de datos.Clasificación externa:La técnica de clasificación externa se utiliza en escenarios donde los datos no pueden caber completamente en la memoria. Los algoritmos de clasificación de tiempo lineal, como la clasificación por base externa o la clasificación por conteo externo, pueden ordenar de manera eficiente grandes conjuntos de datos almacenados en el disco u otros dispositivos de almacenamiento externos.Programación de eventos:Los algoritmos de clasificación de tiempo lineal pueden programar eventos en función de sus horas de inicio o finalización. Ordenar los eventos en orden ascendente facilita la identificación de conflictos, la superposición de períodos o la búsqueda del siguiente período disponible.Analizando archivos de registro:Analizar archivos de registro es una tarea común en la administración y depuración del sistema. Se pueden utilizar algoritmos de clasificación de tiempo lineal para ordenar registros según marcas de tiempo, lo que facilita la identificación de patrones, anomalías o la búsqueda de eventos específicos.Compresión de datos:La clasificación juega un papel esencial en diversas técnicas de compresión de datos. Algoritmos como la Transformada de Burrows-Wheeler (BWT) o la Transformada de Movimiento al Frente (MTF) se basan en el ordenamiento temporal lineal para reorganizar los datos y mejorar la eficiencia de la compresión. Estos son sólo algunos ejemplos de aplicaciones de algoritmos de clasificación en tiempo 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&amp; 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&apos;s maximum value to determine the worksheet&apos;s size. It then counts each element&apos;s occurrence and calculates the worksheet&apos;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.