Introduksjon
Sortering er en essensiell operasjon i informatikk som involverer å ordne elementer i en bestemt rekkefølge, for eksempel numerisk eller alfabetisk rekkefølge. Det er utviklet ulike sorteringsalgoritmer, hver med tids- og effektivitetsindikatorer. Lineær tidssortering er en undergruppe av sorteringsalgoritmer med en betydelig fordel: de kan sortere et gitt sett med elementer i lineær tid, kjøretiden øker lineært med inngangsstørrelsen.
Den mest kjente lineære tidssorteringsalgoritmen er synkende sortering. Beregningsmessig sortering er spesielt effektiv når utvalget av inngangselementer er kjent og relativt lite. Dette eliminerer behovet for å sammenligne elementer, den viktigste tidkrevende operasjonen i mange andre sorteringsalgoritmer. Ved å bruke kunnskap om input-domene oppnår beregningsmessig sortering lineær tidskompleksitet. En numerisk sortering skanner først inngangsmatrisen for å bestemme antallet av hvert element. Den bruker deretter disse tallene til å beregne de riktige plasseringene til elementene i den ordnede resultattabellen. Algoritmen består av følgende trinn:
- For å bestemme rekkevidden, identifiser minimums- og maksimumsverdiene til inngangsmatrisen.
- Lag et regneark initialisert med områdestørrelsen og nuller.
- Iterer over inndatamatrisen og øk hvert element som er funnet.
- Endre regnearket ved å beregne den kumulative totalen for å få de riktige posisjonene for hvert element.
- Opprett en utmatrise med samme størrelse som innmatningsmatrisen.
- Flytt inndatamatrisen igjen, og plasser hvert element i riktig posisjon i utmatrisen basert på regnearket.
- Resultattabellen inneholder nå sorterte elementer.
Hovedfordelen med synkende sortering er at den oppnår en lineær tidskompleksitet på O(n), noe som gjør den veldig effektiv for store inngangsstørrelser. Dens anvendelighet er imidlertid begrenset til scenarier der valget av input-elementer er kjent på forhånd og relativt lite.
Det er viktig å merke seg at andre sorteringsalgoritmer, for eksempel quicksort eller merge, typisk har en tidskompleksitet på O(n log n), som anses som effektiv for mange praktiske applikasjoner. Lineære tidssorteringsalgoritmer, for eksempel numerisk sortering, gir et alternativ når visse begrensninger eller egenskaper ved inngangen tillater bruk av lineær tidskompleksitet.
Historie
Lineære tidssorteringsalgoritmer har en rik historie innen informatikk. Utviklingen av lineær tidsorden kan spores tilbake til midten av det 20. århundre, og bidragene fra vitenskapsmenn og matematikere var betydelige. En av de tidligste lineære tidssorteringsalgoritmene er bøttesortering, foreslått av Harold H. Seward i 1954. En bøttesortering deler inngangselementene inn i et begrenset antall bøtter og sorterer deretter hver bøtte separat. Denne algoritmen har lineær tidskompleksitet hvis fordelingen av inngangselementer er relativt jevn.
I 1959 introduserte Kenneth E. Iverson en radix-algoritme som oppnår lineær tidskompleksitet. Radix sorterer elementer etter deres tall eller tegn fra minst signifikant til mest signifikant. Den bruker robuste sorteringsalgoritmer, for eksempel numerisk eller bøttesortering, for å sortere elementene på hvert siffersted. Radix-sortering ble populær i epoken med hullkort og tidlige datasystemer. Den mest kjente lineære tidssorteringsalgoritmen er imidlertid en oppregning, introdusert av Harold H. Seward og Peter Elias i 1954 og senere uavhengig gjenoppdaget av Harold H. 'Bobby' Johnson i 1961. Numerisk sortering har fått betydelig oppmerksomhet.
Dette er spesielt effektivt når utvalget av inngangselementer er kjent og relativt lite. Historien om lineær tidssortering fortsatte med utviklingen av andre spesialiserte algoritmer. For eksempel, 1987, foreslo Hanan Samet binær distribusjonstresortering, en lineær tidssorteringsalgoritme for flerdimensjonale data. Gjennom årene har forskere fortsatt å studere og forbedre lineære planleggingsalgoritmer, med fokus på spesifikke scenarier og begrensninger. Selv om algoritmer som quicksort og merge er mer utbredt for sin effektivitet i flere scenarier, gir lineær-tidssorteringsalgoritmer verdifulle alternativer når visse omstendigheter tillater at lineær-tidskompleksiteten kan utnyttes. Generelt er historien til lineær tidssortering preget av å søke etter effektive algoritmer som kan sortere store datasett i lineær tid, og overvinne begrensningene til sammenligningsbaserte sorteringsalgoritmer. Bidragene fra ulike forskere banet vei for å utvikle og forstå disse spesialiserte sorteringsteknikkene.
Typer lineær tidssortering
Det finnes flere forskjellige lineære tidssorteringsalgoritmer. De to hovedtypene er tellebaserte algoritmer og radiksbaserte algoritmer. Her er de vanligste lineære tidssorteringsalgoritmene, klassifisert basert på følgende typer:
Tellebaserte algoritmer
Radix-baserte algoritmer
Fordeler med lineær tidssortering
Lineære tidssorteringsalgoritmer, for eksempel numerisk sortering, gir flere fordeler i spesifikke scenarier.
Ulemper med lineær tidssortering
Selv om lineære planleggingsalgoritmer har sine fordeler, har de også visse begrensninger og ulemper:
Når du velger en sorteringsalgoritme, er det viktig å nøye vurdere inndataens spesifikasjoner og sorteringsproblemets krav. Selv om lineære planleggingsalgoritmer gir fordeler i spesifikke scenarier, er de bare noen ganger det mest passende eller effektive valget.
Anvendelser av lineære tidssorteringsalgoritmer
Lineære tidssorteringsalgoritmer er effektive og har mange bruksområder på ulike felt. Her er noen typiske anvendelser av lineær tidsrekkefølge:
Implementering av lineær tidssortering i C++
Her er et eksempel på et program som 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 inngangsmatrisen har blitt sortert i stigende rekkefølge ved å bruke tellesorteringsalgoritmen, noe som resulterer i den sorterte matrisen [1, 2, 2, 3, 3, 4, 8].
I dette C++-programmet tar tellesorteringsfunksjonen en referanse til vektoren arr og kjører tellesorteringsrutinen. Den finner tabellens maksimale verdi for å bestemme regnearkets størrelse. Den teller deretter hvert elements forekomst og beregner regnearkets prefikssum. Deretter lager den en resultatvektor og setter elementene i rekkefølge i henhold til regnearket. Til slutt kopierer den de sorterte elementene tilbake til den opprinnelige matrisen. I den primære funksjonen blir eksempelmatrisen {4, 2, 2, 8, 3, 3, 1} sortert etter oppregningssorteringsalgoritmen og skrevet ut som en sortert matrise. Merk at programmet bruker biblioteker til å jobbe med vektorer og finne det maksimale elementet i en matrise ved å bruke funksjonen max_element.