Ievads
Kārtošana ir būtiska darbība datorzinātnēs, kas ietver elementu sakārtošanu noteiktā secībā, piemēram, ciparu vai alfabētiskā secībā. Ir izstrādāti dažādi šķirošanas algoritmi, katrs ar laika un efektivitātes rādītājiem. Lineārā laika šķirošana ir šķirošanas algoritmu apakškopa ar būtisku priekšrocību: tie var kārtot noteiktu elementu kopu lineārā laikā, izpildes laiks lineāri palielinās līdz ar ievades lielumu.
Vispazīstamākais lineārās laika šķirošanas algoritms ir dilstošā kārtošana. Skaitļošanas šķirošana ir īpaši efektīva, ja ir zināms ievades elementu diapazons un tas ir salīdzinoši mazs. Tas novērš nepieciešamību salīdzināt elementus, kas ir galvenā laikietilpīgā darbība daudzos citos šķirošanas algoritmos. Izmantojot ievades domēna zināšanas, skaitļošanas šķirošana sasniedz lineāru laika sarežģītību. Skaitliskā kārtošana vispirms skenē ievades masīvu, lai noteiktu katra elementa skaitu. Pēc tam tā izmanto šos skaitļus, lai aprēķinātu elementu pareizās pozīcijas sakārtotajā rezultātu tabulā. Algoritms sastāv no šādām darbībām:
- Lai noteiktu diapazonu, nosakiet ievades masīva minimālās un maksimālās vērtības.
- Izveidojiet darblapu, kas inicializēta ar diapazona lielumu un nullēm.
- Atkārtojiet ievades masīvu un palieliniet katru atrasto elementu.
- Modificējiet darblapu, aprēķinot kumulatīvo kopsummu, lai iegūtu katra elementa pareizās pozīcijas.
- Izveidojiet izvades masīvu, kas ir tāda paša izmēra kā ievades masīvs.
- Vēlreiz pārvietojiet ievades masīvu, novietojot katru elementu pareizajā pozīcijā izvades masīvā, pamatojoties uz darblapu.
- Rezultātu tabulā tagad ir sakārtoti elementi.
Dilstošās kārtošanas galvenā priekšrocība ir tā, ka tiek sasniegta lineāra laika sarežģītība O(n), kas padara to ļoti efektīvu lieliem ievades izmēriem. Tomēr tā pielietojamība ir ierobežota ar scenārijiem, kuros ievades elementu izvēle ir iepriekš zināma un salīdzinoši neliela.
Ir svarīgi atzīmēt, ka citiem šķirošanas algoritmiem, piemēram, ātrajai šķirošanai vai sapludināšanai, laika sarežģītība parasti ir O (n log n), kas tiek uzskatīta par efektīvu daudzos praktiskos lietojumos. Lineārā laika šķirošanas algoritmi, piemēram, skaitliskā šķirošana, nodrošina alternatīvu, ja noteikti ievades ierobežojumi vai īpašības ļauj izmantot lineāro laika sarežģītību.
Vēsture
Lineārās laika šķirošanas algoritmiem ir bagāta vēsture datorzinātnēs. Lineārās laika kārtības attīstība ir meklējama 20. gadsimta vidū, un zinātnieku un matemātiķu ieguldījums bija nozīmīgs. Viens no agrākajiem lineārās laika kārtošanas algoritmiem ir kārtošana segmentā, ko 1954. gadā ierosināja Harolds H. Sevards. Kausu kārtošana sadala ievades elementus ierobežotā skaitā segmentu un pēc tam šķiro katru segmentu atsevišķi. Šim algoritmam ir lineāra laika sarežģītība, ja ievades elementu sadalījums ir samērā vienmērīgs.
1959. gadā Kenets E. Aiversons ieviesa radix algoritmu, kas sasniedz lineāro laika sarežģītību. Radix kārto elementus pēc to skaita vai zīmēm no vismazākā līdz visnozīmīgākajam. Tas izmanto spēcīgus šķirošanas algoritmus, piemēram, ciparu vai segmentu kārtošanu, lai kārtotu elementus katrā cipara vietā. Radix šķirošana kļuva populāra perfokaršu un agrīno datorsistēmu laikmetā. Tomēr vispazīstamākais lineārās laika šķirošanas algoritms ir uzskaitījums, ko 1954. gadā ieviesa Harolds H. Sevards un Pīters Eliass, bet vēlāk neatkarīgi no jauna atklāja Harolds H. Bobijs Džonsons 1961. gadā. Skaitliskajai šķirošanai ir pievērsta liela uzmanība.
alfabēts numurēts
Tas ir īpaši efektīvi, ja ievades elementu diapazons ir zināms un salīdzinoši mazs. Lineārās laika šķirošanas vēsture turpinājās, izstrādājot citus specializētus algoritmus. Piemēram, 1987. gadā Hanans Samets ierosināja bināro sadalījuma koku šķirošanu, lineāro laika šķirošanas algoritmu daudzdimensiju datiem. Gadu gaitā pētnieki ir turpinājuši pētīt un uzlabot lineāros plānošanas algoritmus, koncentrējoties uz konkrētiem scenārijiem un ierobežojumiem. Lai gan algoritmi, piemēram, ātrā kārtošana un sapludināšana, tiek plaši izmantoti to efektivitātes dēļ vairākos scenārijos, lineārā laika šķirošanas algoritmi nodrošina vērtīgas alternatīvas, ja noteikti apstākļi ļauj izmantot lineārā laika sarežģītību. Kopumā lineārās laika šķirošanas vēsturi raksturo efektīvu algoritmu meklēšana, kas var kārtot lielas datu kopas lineārā laikā, pārvarot uz salīdzinājumu balstītu šķirošanas algoritmu ierobežojumus. Dažādu pētnieku ieguldījums pavēra ceļu šo specializēto šķirošanas metožu izstrādei un izpratnei.
Lineārās laika šķirošanas veidi
Ir vairāki dažādi lineārās laika šķirošanas algoritmi. Divi galvenie veidi ir uz skaitīšanu balstīti algoritmi un uz radix balstīti algoritmi. Šeit ir visizplatītākie lineārās laika šķirošanas algoritmi, kas klasificēti pēc šādiem veidiem:
Uz skaitīšanu balstīti algoritmi
Uz radiksiem balstīti algoritmi
Lineārās laika šķirošanas priekšrocības
Lineārā laika šķirošanas algoritmi, piemēram, skaitliskā šķirošana, konkrētos scenārijos piedāvā vairākas priekšrocības.
Lineārās laika šķirošanas trūkumi
Lai gan lineārās plānošanas algoritmiem ir savas priekšrocības, tiem ir arī noteikti ierobežojumi un trūkumi:
Izvēloties šķirošanas algoritmu, ir svarīgi rūpīgi apsvērt ievades datu specifiku un šķirošanas problēmas prasības. Lai gan lineārās plānošanas algoritmi piedāvā priekšrocības konkrētos scenārijos, tie tikai dažreiz ir vispiemērotākā vai efektīvākā izvēle.
Lineārā laika šķirošanas algoritmu pielietojumi
Lineārā laika šķirošanas algoritmi ir efektīvi, un tiem ir daudz pielietojumu dažādās jomās. Šeit ir daži tipiski lineārās laika secības lietojumi:
Lineārā laika šķirošanas ieviešana programmā C++
Šeit ir programmas piemērs, kas ievieš skaitīšanas kārtošanu, kas ir lineāra laika šķirošanas algoritms:
#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();>
Tas norāda, ka ievades masīvs ir sakārtots augošā secībā, izmantojot skaitīšanas kārtošanas algoritmu, kā rezultātā iegūts sakārtotais masīvs [1, 2, 2, 3, 3, 4, 8].
Šajā C++ programmā skaitīšanas kārtošanas funkcija izmanto atsauci uz vektoru arr un palaiž skaitīšanas kārtošanas rutīnu. Tas atrod tabulas maksimālo vērtību, lai noteiktu darblapas izmēru. Pēc tam tā saskaita katra elementa rašanos un aprēķina darblapas prefiksa summu. Pēc tam tas izveido rezultāta vektoru un sakārto elementus atbilstoši darblapai. Visbeidzot, tas kopē sakārtotos elementus atpakaļ sākotnējā masīvā. Primārajā funkcijā piemēru masīvs {4, 2, 2, 8, 3, 3, 1} tiek sakārtots pēc uzskaitījuma kārtošanas algoritma un tiek izdrukāts kā sakārtota matrica. Ņemiet vērā, ka programma izmanto bibliotēkas, lai strādātu ar vektoriem un atrastu maksimālo masīva elementu, izmantojot funkciju max_element.