Uvod
Razvrščanje je bistvena operacija v računalništvu, ki vključuje razvrščanje elementov v določen vrstni red, kot je številčni ali abecedni vrstni red. Razviti so bili različni algoritmi za razvrščanje, vsak s kazalniki časa in učinkovitosti. Linearno časovno razvrščanje je podmnožica algoritmov za razvrščanje s pomembno prednostjo: razvrstijo lahko dani nabor elementov v linearnem času, čas izvajanja se povečuje linearno z velikostjo vnosa.
int niz
Najbolj znan algoritem linearnega časovnega razvrščanja je padajoče razvrščanje. Računalniško razvrščanje je še posebej učinkovito, če je obseg vhodnih elementov znan in razmeroma majhen. To odpravlja potrebo po primerjavi elementov, glavni zamudni operaciji v mnogih drugih algoritmih za razvrščanje. Z uporabo znanja o vhodni domeni računalniško razvrščanje doseže linearno časovno kompleksnost. Numerično razvrščanje najprej pregleda vhodno matriko, da določi število vsakega elementa. Te številke nato uporabi za izračun pravilnih položajev elementov v urejeni tabeli rezultatov. Algoritem je sestavljen iz naslednjih korakov:
- Če želite določiti obseg, določite najmanjšo in največjo vrednost vhodne matrike.
- Ustvarite delovni list, inicializiran z velikostjo obsega in ničlami.
- Preglejte vhodno matriko in povečajte vsak najdeni element.
- Spremenite delovni list tako, da izračunate kumulativno vsoto, da dobite pravilne položaje za vsak element.
- Ustvarite izhodno polje enake velikosti kot vhodno polje.
- Ponovno premaknite vhodno matriko in postavite vsak element na pravilen položaj v izhodni matriki glede na delovni list.
- Tabela rezultatov zdaj vsebuje razvrščene elemente.
Glavna prednost padajočega razvrščanja je, da doseže linearno časovno kompleksnost O(n), zaradi česar je zelo učinkovito za velike vhodne velikosti. Vendar je njegova uporabnost omejena na scenarije, kjer je izbira vhodnih elementov znana vnaprej in relativno majhna.
Pomembno je omeniti, da imajo drugi algoritmi za razvrščanje, kot sta hitro razvrščanje ali spajanje, običajno časovno kompleksnost O(n log n), kar velja za učinkovito za številne praktične aplikacije. Algoritmi za linearno časovno razvrščanje, kot je numerično razvrščanje, nudijo alternativo, kadar določene omejitve ali lastnosti vnosa omogočajo uporabo linearne časovne kompleksnosti.
Zgodovina
Algoritmi za linearno časovno razvrščanje imajo v računalništvu bogato zgodovino. Razvoj linearnega časovnega reda sega v sredino 20. stoletja, prispevki znanstvenikov in matematikov pa so bili pomembni. Eden najzgodnejših algoritmov linearnega časovnega razvrščanja je razvrščanje po vedrih, ki ga je leta 1954 predlagal Harold H. Seward. Razvrščanje po vedrih razdeli vhodne elemente na končno število veder in nato razvrsti vsako vedro posebej. Ta algoritem ima linearno časovno kompleksnost, če je porazdelitev vhodnih elementov relativno enakomerna.
Leta 1959 je Kenneth E. Iverson predstavil algoritem radix, ki dosega linearno časovno kompleksnost. Radix razvrsti elemente po njihovih številkah ali predznakih od najmanj pomembnega do najpomembnejšega. Uporablja robustne algoritme za razvrščanje, kot je številsko ali vedro razvrščanje, za razvrščanje elementov na vsaki lokaciji števke. Razvrščanje po sistemu Radix je postalo priljubljeno v dobi luknjanih kartic in zgodnjih računalniških sistemov. Vendar pa je najbolj znan linearni algoritem za časovno razvrščanje štetje, ki sta ga predstavila Harold H. Seward in Peter Elias leta 1954, kasneje pa ga je neodvisno ponovno odkril Harold H. 'Bobby' Johnson leta 1961. Numerično razvrščanje je bilo deležno precejšnje pozornosti.
To je še posebej učinkovito, če je obseg vhodnih elementov znan in relativno majhen. Zgodovina linearnega časovnega razvrščanja se je nadaljevala z razvojem drugih specializiranih algoritmov. Na primer, leta 1987 je Hanan Samet predlagal binarno porazdelitveno drevesno razvrščanje, linearni algoritem časovnega razvrščanja za večdimenzionalne podatke. Z leti so raziskovalci še naprej preučevali in izboljševali algoritme linearnega razporejanja, pri čemer so se osredotočali na specifične scenarije in omejitve. Čeprav se algoritmi, kot sta hitro razvrščanje in združevanje, pogosteje uporabljajo zaradi svoje učinkovitosti v več scenarijih, algoritmi za linearno časovno razvrščanje zagotavljajo dragocene alternative, kadar določene okoliščine omogočajo izkoriščanje kompleksnosti linearnega časa. Na splošno je za zgodovino linearnega časovnega razvrščanja značilno iskanje učinkovitih algoritmov, ki lahko razvrstijo velike podatkovne nize v linearnem času, s čimer presežejo omejitve algoritmov za razvrščanje, ki temeljijo na primerjavi. Prispevki različnih raziskovalcev so utrli pot razvoju in razumevanju teh specializiranih tehnik razvrščanja.
Vrste linearnega časovnega razvrščanja
Obstaja več različnih algoritmov linearnega časovnega razvrščanja. Dve glavni vrsti sta algoritmi, ki temeljijo na štetju, in algoritmi, ki temeljijo na korenu. Tu so najpogostejši algoritmi linearnega časovnega razvrščanja, razvrščeni glede na naslednje vrste:
Algoritmi na osnovi štetja
Algoritmi na osnovi Radixa
Prednosti linearnega časovnega razvrščanja
Algoritmi linearnega časovnega razvrščanja, kot je numerično razvrščanje, ponujajo več prednosti v določenih scenarijih.
Slabosti linearnega časovnega razvrščanja
Čeprav imajo algoritmi linearnega razporejanja svoje prednosti, imajo tudi določene omejitve in slabosti:
Pri izbiri sortirnega algoritma je nujno skrbno upoštevati posebnosti vhodnih podatkov in zahteve problema sortiranja. Čeprav linearni algoritmi za razporejanje ponujajo prednosti v posebnih scenarijih, so le včasih najprimernejša ali najučinkovitejša izbira.
Uporaba algoritmov za linearno časovno razvrščanje
Algoritmi za linearno časovno razvrščanje so učinkoviti in imajo veliko aplikacij na različnih področjih. Tukaj je nekaj tipičnih aplikacij linearnega časovnega reda:
Implementacija linearnega časovnega razvrščanja v C++
Tukaj je primer programa, ki izvaja Counting Sort, ki je linearni algoritem za razvrščanje časa:
#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();>
To pomeni, da je bila vhodna matrika razvrščena v naraščajočem vrstnem redu z uporabo algoritma Counting Sort, rezultat pa je razvrščena matrika [1, 2, 2, 3, 3, 4, 8].
V tem programu C++ se funkcija razvrščanja s štetjem sklicuje na vektor arr in zažene rutino razvrščanja s štetjem. Poišče največjo vrednost tabele, da določi velikost delovnega lista. Nato prešteje pojavnost vsakega elementa in izračuna vsoto predpone delovnega lista. Nato ustvari vektor rezultata in postavi elemente v vrstni red glede na delovni list. Na koncu kopira razvrščene elemente nazaj v izvirno matriko. V primarni funkciji je primer matrike {4, 2, 2, 8, 3, 3, 1} razvrščen z algoritmom za razvrščanje po številu in natisnjen kot razvrščena matrika. Upoštevajte, da program uporablja knjižnice za delo z vektorji in iskanje največjega elementa matrike s funkcijo max_element.