Introduktion
Sortering er en væsentlig operation inden for datalogi, der involverer at arrangere elementer i en bestemt rækkefølge, såsom numerisk eller alfabetisk rækkefølge. Der er udviklet forskellige sorteringsalgoritmer, hver med tids- og effektivitetsindikatorer. Lineær tidssortering er en delmængde af sorteringsalgoritmer med en væsentlig fordel: de kan sortere et givet sæt af elementer i lineær tid, køretiden øges lineært med inputstørrelsen.
Den bedst kendte lineære tidssorteringsalgoritme er faldende sortering. Beregningsmæssig sortering er særlig effektiv, når rækken af input-elementer er kendt og relativt lille. Dette eliminerer behovet for at sammenligne elementer, den vigtigste tidskrævende operation i mange andre sorteringsalgoritmer. Ved hjælp af input-domæne viden opnår beregningsmæssig sortering lineær tidskompleksitet. En numerisk sortering scanner først input-arrayet for at bestemme antallet af hvert element. Den bruger derefter disse tal til at beregne de korrekte placeringer af elementerne i den ordnede resultattabel. Algoritmen består af følgende trin:
- For at bestemme området skal du identificere minimum- og maksimumværdierne for input-arrayet.
- Opret et regneark initialiseret med områdestørrelsen og nuller.
- Gentag over input-arrayet og øg hvert element fundet.
- Rediger regnearket ved at beregne den kumulative total for at opnå de korrekte positioner for hvert element.
- Opret et output-array af samme størrelse som input-arrayet.
- Flyt input-arrayet igen, og placer hvert element i den korrekte position i output-arrayet baseret på regnearket.
- Resultattabellen indeholder nu sorterede elementer.
Den største fordel ved faldende sortering er, at den opnår en lineær tidskompleksitet på O(n), hvilket gør den meget effektiv til store inputstørrelser. Dens anvendelighed er dog begrænset til scenarier, hvor valget af inputelementer er kendt på forhånd og relativt lille.
Det er vigtigt at bemærke, at andre sorteringsalgoritmer, såsom quicksort eller merge, typisk har en tidskompleksitet på O(n log n), hvilket anses for at være effektivt til mange praktiske anvendelser. Lineære tidssorteringsalgoritmer, såsom numerisk sortering, giver et alternativ, når visse begrænsninger eller egenskaber af inputtet tillader lineær tidskompleksitet at blive brugt.
Historie
Lineære tidssorteringsalgoritmer har en rig historie inden for datalogi. Udviklingen af lineær tidsorden kan spores tilbage til midten af det 20. århundrede, og bidragene fra videnskabsmænd og matematikere var betydelige. En af de tidligste lineære tidssorteringsalgoritmer er spandsortering, foreslået af Harold H. Seward i 1954. En spandsortering opdeler inputelementerne i et begrænset antal spande og sorterer derefter hver spand separat. Denne algoritme har lineær tidskompleksitet, hvis fordelingen af inputelementer er relativt ensartet.
I 1959 introducerede Kenneth E. Iverson en radix-algoritme, der opnår lineær tidskompleksitet. Radix sorterer elementer efter deres tal eller tegn fra mindst signifikant til mest signifikant. Den bruger robuste sorteringsalgoritmer, såsom numerisk eller bucket-sortering, til at sortere elementerne på hver cifferplacering. Radix-sortering blev populær i æraen med hulkort og tidlige computersystemer. Den mest kendte lineære tidssorteringsalgoritme er dog en opregning, introduceret af Harold H. Seward og Peter Elias i 1954 og senere uafhængigt genopdaget af Harold H. 'Bobby' Johnson i 1961. Numerisk sortering har fået stor opmærksomhed.
Dette er særligt effektivt, når rækken af input-elementer er kendt og relativt lille. Historien om lineær tidssortering fortsatte med udviklingen af andre specialiserede algoritmer. For eksempel foreslog Hanan Samet i 1987 binær distributionstræsortering, en lineær tidssorteringsalgoritme for multidimensionelle data. I årenes løb har forskere fortsat med at studere og forbedre lineære planlægningsalgoritmer med fokus på specifikke scenarier og begrænsninger. Selvom algoritmer som quicksort og merge er mere udbredt på grund af deres effektivitet i flere scenarier, giver lineær-tidssorteringsalgoritmer værdifulde alternativer, når visse omstændigheder tillader lineær-tidskompleksiteten at blive udnyttet. Generelt er historien om lineær tidssortering karakteriseret ved at søge efter effektive algoritmer, der kan sortere store datasæt i lineær tid, og overvinde begrænsningerne ved sammenligningsbaserede sorteringsalgoritmer. Bidragene fra forskellige forskere banede vejen for udvikling og forståelse af disse specialiserede sorteringsteknikker.
Typer af lineær tidssortering
Der er flere forskellige lineære tidssorteringsalgoritmer. De to hovedtyper er tællebaserede algoritmer og radix-baserede algoritmer. Her er de mest almindelige lineære tidssorteringsalgoritmer, klassificeret baseret på følgende typer:
Optællingsbaserede algoritmer
Radix-baserede algoritmer
Fordele ved lineær tidssortering
Lineære tidssorteringsalgoritmer, såsom numerisk sortering, giver flere fordele i specifikke scenarier.
Ulemper ved lineær tidssortering
Selvom lineære planlægningsalgoritmer har deres fordele, har de også visse begrænsninger og ulemper:
Når du vælger en sorteringsalgoritme, er det vigtigt nøje at overveje inputdataens specifikationer og sorteringsproblemets krav. Selvom lineære planlægningsalgoritmer tilbyder fordele i specifikke scenarier, er de kun nogle gange det mest passende eller effektive valg.
Anvendelser af lineære tidssorteringsalgoritmer
Lineære tidssorteringsalgoritmer er effektive og har mange anvendelsesmuligheder inden for forskellige områder. Her er nogle typiske anvendelser af lineær tidsrækkefølge:
Implementering af lineær tidssortering i C++
Her er et eksempel på et program, der implementerer Counting Sort, som er en lineær tidssorteringsalgoritme:
#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();>
Dette indikerer, at input-arrayet er blevet sorteret i stigende rækkefølge ved hjælp af Counting Sort-algoritmen, hvilket resulterer i det sorterede array [1, 2, 2, 3, 3, 4, 8].
I dette C++-program tager tællesorteringsfunktionen en reference til vektoren arr og kører tællesorteringsrutinen. Den finder tabellens maksimale værdi for at bestemme regnearkets størrelse. Den tæller derefter hvert elements forekomst og beregner regnearkets præfikssum. Derefter opretter den en resultatvektor og sætter elementerne i rækkefølge i henhold til regnearket. Til sidst kopierer den de sorterede elementer tilbage i det originale array. I den primære funktion sorteres eksempelarrayet {4, 2, 2, 8, 3, 3, 1} efter opregningssorteringsalgoritmen og udskrives som en sorteret matrix. Bemærk, at programmet bruger biblioteker til at arbejde med vektorer og finde det maksimale element i et array ved hjælp af funktionen max_element.