Úvod
Triedenie je základná operácia v informatike, ktorá zahŕňa usporiadanie prvkov do určitého poradia, ako je číselné alebo abecedné poradie. Boli vyvinuté rôzne triediace algoritmy, každý s ukazovateľmi času a účinnosti. Lineárne časové triedenie je podmnožinou triediacich algoritmov s významnou výhodou: dokážu triediť danú množinu prvkov v lineárnom čase, doba chodu sa lineárne zvyšuje so vstupnou veľkosťou.
Najznámejší lineárny algoritmus triedenia podľa času je zostupné triedenie. Výpočtové triedenie je obzvlášť efektívne, keď je rozsah vstupných prvkov známy a relatívne malý. To eliminuje potrebu porovnávania prvkov, čo je hlavná časovo náročná operácia v mnohých iných triediacich algoritmoch. Pomocou znalosti vstupnej domény výpočtové triedenie dosahuje lineárnu časovú zložitosť. Číselné triedenie najprv prehľadá vstupné pole, aby určilo počet každého prvku. Tieto čísla potom použije na výpočet správnych pozícií prvkov v tabuľke usporiadaných výsledkov. Algoritmus pozostáva z nasledujúcich krokov:
- Na určenie rozsahu identifikujte minimálne a maximálne hodnoty vstupného poľa.
- Vytvorte pracovný hárok inicializovaný s veľkosťou rozsahu a nulami.
- Iterujte cez vstupné pole a zvýšte každý nájdený prvok.
- Upravte pracovný hárok výpočtom kumulatívneho súčtu, aby ste získali správne pozície pre každý prvok.
- Vytvorte výstupné pole rovnakej veľkosti ako vstupné pole.
- Znova presuňte vstupné pole a umiestnite každý prvok na správnu pozíciu vo výstupnom poli na základe pracovného hárka.
- Tabuľka výsledkov teraz obsahuje zoradené prvky.
Hlavnou výhodou zostupného triedenia je, že dosahuje lineárnu časovú zložitosť O(n), čo ho robí veľmi efektívnym pre veľké vstupné veľkosti. Jeho použiteľnosť je však obmedzená na scenáre, kde je výber vstupných prvkov vopred známy a relatívne malý.
Je dôležité poznamenať, že iné triediace algoritmy, ako napríklad rýchle triedenie alebo zlúčenie, majú zvyčajne časovú zložitosť O(n log n), čo sa považuje za efektívne pre mnohé praktické aplikácie. Algoritmy lineárneho časového triedenia, ako je numerické triedenie, poskytujú alternatívu, keď určité obmedzenia alebo vlastnosti vstupu umožňujú použitie lineárnej časovej zložitosti.
História
Algoritmy triedenia lineárneho času majú v informatike bohatú históriu. Vývoj lineárneho časového poriadku možno vysledovať do polovice 20. storočia a významné boli príspevky vedcov a matematikov. Jedným z prvých lineárnych algoritmov triedenia v čase je triedenie segmentov, ktoré navrhol Harold H. Seward v roku 1954. Triedenie segmentov rozdeľuje vstupné prvky do konečného počtu segmentov a potom triedi každý segment samostatne. Tento algoritmus má lineárnu časovú zložitosť, ak je rozdelenie vstupných prvkov relatívne rovnomerné.
V roku 1959 Kenneth E. Iverson predstavil radixový algoritmus, ktorý dosahuje lineárnu časovú zložitosť. Radix triedi prvky podľa ich čísel alebo znakov od najmenej významných po najvýznamnejšie. Používa robustné triediace algoritmy, ako je číselné alebo skupinové triedenie, na triedenie prvkov na každom mieste číslic. Radixové triedenie sa stalo populárnym v ére diernych štítkov a skorých počítačových systémov. Najznámejším lineárnym časovým triediacim algoritmom je však enumerácia, ktorú zaviedli Harold H. Seward a Peter Elias v roku 1954 a neskôr nezávisle znovuobjavený Haroldom H. 'Bobby' Johnsonom v roku 1961. Numerickému triedeniu sa venuje značná pozornosť.
Toto je obzvlášť účinné, keď je rozsah vstupných prvkov známy a relatívne malý. História lineárneho triedenia času pokračovala vývojom ďalších špecializovaných algoritmov. Napríklad v roku 1987 Hanan Samet navrhol triedenie binárneho distribučného stromu, lineárny algoritmus triedenia v čase pre viacrozmerné dáta. V priebehu rokov výskumníci pokračovali v štúdiu a zlepšovaní algoritmov lineárneho plánovania so zameraním na konkrétne scenáre a obmedzenia. Aj keď sa algoritmy ako rýchle triedenie a zlúčenie častejšie používajú pre svoju efektivitu vo viacerých scenároch, algoritmy triedenia s lineárnym časom poskytujú cenné alternatívy, keď určité okolnosti umožňujú využiť zložitosť lineárneho času. Vo všeobecnosti je história triedenia v lineárnom čase charakterizovaná hľadaním efektívnych algoritmov, ktoré dokážu triediť veľké súbory údajov v lineárnom čase, čím sa prekonávajú obmedzenia triediacich algoritmov založených na porovnávaní. Príspevky rôznych výskumníkov vydláždili cestu pre vývoj a pochopenie týchto špecializovaných techník triedenia.
linux premenovať priečinok
Typy lineárneho triedenia podľa času
Existuje niekoľko rôznych algoritmov lineárneho časového triedenia. Dva hlavné typy sú algoritmy založené na počte a algoritmy založené na radixe. Tu sú najbežnejšie algoritmy lineárneho triedenia podľa času, klasifikované na základe nasledujúcich typov:
Algoritmy založené na počítaní
Algoritmy založené na Radixe
Výhody lineárneho časového triedenia
Algoritmy lineárneho triedenia, ako je numerické triedenie, ponúkajú v špecifických scenároch niekoľko výhod.
Nevýhody lineárneho časového triedenia
Aj keď algoritmy lineárneho plánovania majú svoje výhody, majú aj určité obmedzenia a nevýhody:
vb a vb net
Pri výbere triediaceho algoritmu je nevyhnutné starostlivo zvážiť špecifiká vstupných dát a požiadavky triediaceho problému. Aj keď algoritmy lineárneho plánovania ponúkajú výhody v špecifických scenároch, len niekedy sú tou najvhodnejšou alebo najefektívnejšou voľbou.
Aplikácie lineárnych algoritmov triedenia v čase
Algoritmy lineárneho triedenia sú efektívne a majú mnoho aplikácií v rôznych oblastiach. Tu sú niektoré typické aplikácie lineárneho časového poriadku:
Implementácia lineárneho triedenia v C++
Tu je príklad programu implementujúceho Counting Sort, čo je lineárny algoritmus triedenia podľa času:
#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 znamená, že vstupné pole bolo zoradené vo vzostupnom poradí pomocou algoritmu Counting Sort, výsledkom čoho je zoradené pole [1, 2, 2, 3, 3, 4, 8].
V tomto programe C++ používa funkcia triedenia počítania odkaz na vektor arr a spúšťa rutinu triedenia počítania. Nájde maximálnu hodnotu tabuľky na určenie veľkosti pracovného hárka. Potom spočíta výskyt každého prvku a vypočíta súčet prefixov hárka. Potom vytvorí vektor výsledku a usporiada prvky podľa pracovného hárka. Nakoniec skopíruje zoradené prvky späť do pôvodného poľa. V primárnej funkcii je vzorové pole {4, 2, 2, 8, 3, 3, 1} zoradené podľa algoritmu triedenia enumerácie a vytlačené ako triedená matica. Všimnite si, že program používa knižnice na prácu s vektormi a nájdenie maximálneho prvku poľa pomocou funkcie max_element.