introduzione
L'ordinamento è un'operazione essenziale in informatica che comporta la disposizione degli elementi in un ordine specifico, come l'ordine numerico o alfabetico. Sono stati sviluppati vari algoritmi di ordinamento, ciascuno con indicatori di tempo ed efficienza. L'ordinamento temporale lineare è un sottoinsieme di algoritmi di ordinamento con un vantaggio significativo: possono ordinare un dato insieme di elementi in tempo lineare, il tempo di esecuzione aumenta linearmente con la dimensione dell'input.
L'algoritmo di ordinamento temporale lineare più noto è l'ordinamento discendente. L'ordinamento computazionale è particolarmente efficiente quando la gamma di elementi di input è nota e relativamente piccola. Ciò elimina la necessità di confrontare gli elementi, la principale operazione dispendiosa in termini di tempo in molti altri algoritmi di ordinamento. Utilizzando la conoscenza del dominio di input, l'ordinamento computazionale raggiunge una complessità temporale lineare. Un ordinamento numerico esegue innanzitutto la scansione dell'array di input per determinare il conteggio di ciascun elemento. Quindi utilizza questi numeri per calcolare le posizioni corrette degli elementi nella tabella dei risultati ordinata. L'algoritmo è composto dai seguenti passaggi:
- Per determinare l'intervallo, identificare i valori minimo e massimo dell'array di input.
- Crea un foglio di lavoro inizializzato con le dimensioni dell'intervallo e gli zeri.
- Itera sull'array di input e incrementa ogni elemento trovato.
- Modificare il foglio di lavoro calcolando il totale cumulativo per ottenere le posizioni corrette per ciascun elemento.
- Crea un array di output delle stesse dimensioni dell'array di input.
- Sposta nuovamente l'array di input, posizionando ciascun elemento nella posizione corretta nell'array di output in base al foglio di lavoro.
- La tabella dei risultati ora contiene elementi ordinati.
Il vantaggio principale dell'ordinamento discendente è che raggiunge una complessità temporale lineare pari a O(n), che lo rende molto efficiente per input di grandi dimensioni. Tuttavia, la sua applicabilità è limitata a scenari in cui la scelta degli elementi di input è nota in anticipo e relativamente ridotta.
converti int in stringa java
È importante notare che altri algoritmi di ordinamento, come Quicksort o Merge, hanno tipicamente una complessità temporale di O(n log n), che è considerata efficiente per molte applicazioni pratiche. Gli algoritmi di ordinamento temporale lineare, come l'ordinamento numerico, forniscono un'alternativa quando determinati vincoli o proprietà dell'input consentono l'utilizzo della complessità temporale lineare.
Storia
Gli algoritmi di ordinamento temporale lineare hanno una ricca storia nell'informatica. Lo sviluppo dell'ordine temporale lineare può essere fatto risalire alla metà del XX secolo e il contributo di scienziati e matematici è stato significativo. Uno dei primi algoritmi di ordinamento temporale lineare è il bucket sort, proposto da Harold H. Seward nel 1954. Un bucket sort divide gli elementi di input in un numero finito di bucket e quindi ordina ciascun bucket separatamente. Questo algoritmo ha complessità temporale lineare se la distribuzione degli elementi di input è relativamente uniforme.
Nel 1959, Kenneth E. Iverson introdusse un algoritmo radice che raggiunge la complessità temporale lineare. Radix ordina gli elementi in base al numero o al segno, dal meno significativo al più significativo. Utilizza robusti algoritmi di ordinamento, come l'ordinamento numerico o per bucket, per ordinare gli elementi in ciascuna posizione della cifra. L'ordinamento radicale divenne popolare nell'era delle schede perforate e dei primi sistemi informatici. Tuttavia, l'algoritmo di ordinamento temporale lineare più noto è un'enumerazione, introdotta da Harold H. Seward e Peter Elias nel 1954 e successivamente riscoperta in modo indipendente da Harold H. 'Bobby' Johnson nel 1961. L'ordinamento numerico ha ricevuto notevole attenzione.
Ciò è particolarmente efficace quando la gamma di elementi di input è nota e relativamente piccola. La storia dell'ordinamento temporale lineare è continuata con lo sviluppo di altri algoritmi specializzati. Ad esempio, nel 1987, Hanan Samet propose l'ordinamento ad albero di distribuzione binario, un algoritmo di ordinamento temporale lineare per dati multidimensionali. Nel corso degli anni, i ricercatori hanno continuato a studiare e migliorare gli algoritmi di pianificazione lineare, concentrandosi su scenari e vincoli specifici. Sebbene algoritmi come Quicksort e Merge siano più ampiamente utilizzati per la loro efficienza in più scenari, gli algoritmi di ordinamento in tempo lineare forniscono valide alternative quando determinate circostanze consentono di sfruttare la complessità del tempo lineare. In generale, la storia dell'ordinamento temporale lineare è caratterizzata dalla ricerca di algoritmi efficienti in grado di ordinare grandi insiemi di dati in tempo lineare, superando i limiti degli algoritmi di ordinamento basati sul confronto. I contributi di vari ricercatori hanno aperto la strada allo sviluppo e alla comprensione di queste tecniche di smistamento specializzate.
Tipi di ordinamento temporale lineare
Esistono diversi algoritmi di ordinamento temporale lineare. I due tipi principali sono algoritmi basati sul conteggio e algoritmi basati su radice. Ecco gli algoritmi di ordinamento temporale lineare più comuni, classificati in base alle seguenti tipologie:
Algoritmi basati sul conteggio
Algoritmi basati su radice
Vantaggi dell'ordinamento temporale lineare
Gli algoritmi di ordinamento temporale lineare, come l'ordinamento numerico, offrono numerosi vantaggi in scenari specifici.
Svantaggi dell'ordinamento temporale lineare
Sebbene gli algoritmi di pianificazione lineare abbiano i loro vantaggi, presentano anche alcune limitazioni e svantaggi:
comando di allungamento di AutoCAD
Quando si sceglie un algoritmo di ordinamento, è essenziale considerare attentamente le specificità dei dati di input e i requisiti del problema di ordinamento. Sebbene gli algoritmi di pianificazione lineare offrano vantaggi in scenari specifici, solo talvolta rappresentano la scelta più appropriata o efficiente.
Applicazioni degli algoritmi di ordinamento temporale lineare
Gli algoritmi di ordinamento temporale lineare sono efficienti e hanno molte applicazioni in vari campi. Ecco alcune applicazioni tipiche dell'ordine temporale lineare:
Implementazione dell'ordinamento temporale lineare in C++
Ecco un esempio di un programma che implementa Counting Sort, che è un algoritmo di ordinamento temporale lineare:
ordinamento delle bolle
#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();>
Ciò indica che l'array di input è stato ordinato in ordine crescente utilizzando l'algoritmo Counting Sort, risultando nell'array ordinato [1, 2, 2, 3, 3, 4, 8].
In questo programma C++, la funzione di ordinamento del conteggio prende un riferimento al vettore arr ed esegue la routine di ordinamento del conteggio. Trova il valore massimo della tabella per determinare la dimensione del foglio di lavoro. Quindi conta le occorrenze di ciascun elemento e calcola la somma dei prefissi del foglio di lavoro. Quindi, crea un vettore dei risultati e mette gli elementi in ordine in base al foglio di lavoro. Infine, copia nuovamente gli elementi ordinati nell'array originale. Nella funzione primaria, l'array di esempio {4, 2, 2, 8, 3, 3, 1} viene ordinato dall'algoritmo di ordinamento dell'enumerazione e stampato come una matrice ordinata. Tieni presente che il programma utilizza le librerie per lavorare con i vettori e trovare l'elemento massimo di un array utilizzando la funzione max_element.