Introdução
A classificação é uma operação essencial na ciência da computação que envolve organizar os elementos em uma ordem específica, como ordem numérica ou alfabética. Vários algoritmos de classificação foram desenvolvidos, cada um com indicadores de tempo e eficiência. A classificação em tempo linear é um subconjunto de algoritmos de classificação com uma vantagem significativa: eles podem classificar um determinado conjunto de elementos em tempo linear, o tempo de execução aumenta linearmente com o tamanho da entrada.
meulivericket
O algoritmo de classificação de tempo linear mais conhecido é a classificação descendente. A classificação computacional é particularmente eficiente quando a gama de elementos de entrada é conhecida e relativamente pequena. Isso elimina a necessidade de comparar elementos, a principal operação demorada em muitos outros algoritmos de classificação. Usando o conhecimento do domínio de entrada, a classificação computacional atinge a complexidade do tempo linear. Uma classificação numérica primeiro verifica a matriz de entrada para determinar a contagem de cada elemento. Em seguida, utiliza esses números para calcular as posições corretas dos elementos na tabela de resultados ordenados. O algoritmo consiste nas seguintes etapas:
- Para determinar o intervalo, identifique os valores mínimo e máximo da matriz de entrada.
- Crie uma planilha inicializada com o tamanho do intervalo e zeros.
- Itere sobre a matriz de entrada e incremente cada elemento encontrado.
- Modifique a planilha calculando o total acumulado para obter as posições corretas para cada elemento.
- Crie uma matriz de saída do mesmo tamanho da matriz de entrada.
- Mova a matriz de entrada novamente, colocando cada elemento na posição correta na matriz de saída com base na planilha.
- A tabela de resultados agora contém elementos classificados.
A principal vantagem da classificação descendente é que ela atinge uma complexidade de tempo linear de O(n), o que a torna muito eficiente para grandes tamanhos de entrada. Contudo, a sua aplicabilidade é limitada a cenários onde a escolha dos elementos de entrada é conhecida antecipadamente e relativamente pequena.
É importante notar que outros algoritmos de ordenação, como quicksort ou merge, normalmente possuem uma complexidade de tempo de O(n log n), que é considerada eficiente para muitas aplicações práticas. Algoritmos de classificação de tempo linear, como classificação numérica, fornecem uma alternativa quando certas restrições ou propriedades da entrada permitem o uso de complexidade de tempo linear.
História
Algoritmos de classificação de tempo linear têm uma história rica na ciência da computação. O desenvolvimento da ordem do tempo linear remonta a meados do século 20, e as contribuições de cientistas e matemáticos foram significativas. Um dos primeiros algoritmos de classificação de tempo linear é o bucket sort, proposto por Harold H. Seward em 1954. Um bucket sort divide os elementos de entrada em um número finito de buckets e então classifica cada bucket separadamente. Este algoritmo possui complexidade de tempo linear se a distribuição dos elementos de entrada for relativamente uniforme.
Em 1959, Kenneth E. Iverson introduziu um algoritmo radix que atinge complexidade de tempo linear. Radix classifica os elementos por seus números ou sinais, do menos significativo ao mais significativo. Ele usa algoritmos de classificação robustos, como classificação numérica ou de intervalo, para classificar os elementos em cada local de dígito. A classificação Radix tornou-se popular na era dos cartões perfurados e dos primeiros sistemas de computador. No entanto, o algoritmo de classificação de tempo linear mais conhecido é uma enumeração, introduzida por Harold H. Seward e Peter Elias em 1954 e mais tarde redescoberta de forma independente por Harold H. 'Bobby' Johnson em 1961. A classificação numérica recebeu atenção considerável.
Isto é particularmente eficaz quando a gama de elementos de entrada é conhecida e relativamente pequena. A história da classificação linear no tempo continuou com o desenvolvimento de outros algoritmos especializados. Por exemplo, em 1987, Hanan Samet propôs a classificação em árvore de distribuição binária, um algoritmo de classificação linear no tempo para dados multidimensionais. Ao longo dos anos, os pesquisadores continuaram a estudar e melhorar algoritmos de escalonamento linear, concentrando-se em cenários e restrições específicas. Embora algoritmos como quicksort e merge sejam mais amplamente usados por sua eficiência em mais cenários, os algoritmos de classificação em tempo linear fornecem alternativas valiosas quando certas circunstâncias permitem que a complexidade do tempo linear seja explorada. Em geral, a história da ordenação em tempo linear é caracterizada pela busca por algoritmos eficientes que possam ordenar grandes conjuntos de dados em tempo linear, superando as limitações dos algoritmos de ordenação baseados em comparação. As contribuições de vários pesquisadores abriram caminho para o desenvolvimento e compreensão dessas técnicas especializadas de classificação.
Tipos de classificação de tempo linear
Existem vários algoritmos diferentes de classificação de tempo linear. Os dois tipos principais são algoritmos baseados em contagem e algoritmos baseados em raiz. Aqui estão os algoritmos de classificação de tempo linear mais comuns, classificados com base nos seguintes tipos:
Algoritmos Baseados em Contagem
Algoritmos Baseados em Radix
Vantagens da classificação de tempo linear
Algoritmos de classificação linear em tempo, como classificação numérica, oferecem diversas vantagens em cenários específicos.
Desvantagens da classificação de tempo linear
Embora os algoritmos de escalonamento linear tenham suas vantagens, eles também apresentam certas limitações e desvantagens:
Ao escolher um algoritmo de classificação, é essencial considerar cuidadosamente as especificidades dos dados de entrada e os requisitos do problema de classificação. Embora os algoritmos de escalonamento linear ofereçam vantagens em cenários específicos, eles são apenas algumas vezes a escolha mais apropriada ou eficiente.
Aplicações de algoritmos de classificação de tempo linear
Algoritmos de classificação em tempo linear são eficientes e têm muitas aplicações em vários campos. Aqui estão algumas aplicações típicas de ordem de tempo linear:
Implementação de classificação de tempo linear em C++
Aqui está um exemplo de um programa que implementa Counting Sort, que é um algoritmo de classificação de tempo linear:
#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();>
Isso indica que a matriz de entrada foi classificada em ordem crescente usando o algoritmo Counting Sort, resultando na matriz classificada [1, 2, 2, 3, 3, 4, 8].
Neste programa C++, a função de classificação de contagem faz uma referência ao vetor arr e executa a rotina de classificação de contagem. Encontra o valor máximo da tabela para determinar o tamanho da planilha. Em seguida, conta a ocorrência de cada elemento e calcula a soma dos prefixos da planilha. Em seguida, ele cria um vetor de resultado e ordena os elementos de acordo com a planilha. Finalmente, ele copia os elementos classificados de volta ao array original. Na função primária, a matriz de exemplo {4, 2, 2, 8, 3, 3, 1} é classificada pelo algoritmo de classificação de enumeração e impressa como uma matriz classificada. Observe que o programa utiliza bibliotecas para trabalhar com vetores e encontrar o elemento máximo de um array usando a função max_element.