logo

Lineárne časové triedenie

Ú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:

  1. Na určenie rozsahu identifikujte minimálne a maximálne hodnoty vstupného poľa.
  2. Vytvorte pracovný hárok inicializovaný s veľkosťou rozsahu a nulami.
  3. Iterujte cez vstupné pole a zvýšte každý nájdený prvok.
  4. Upravte pracovný hárok výpočtom kumulatívneho súčtu, aby ste získali správne pozície pre každý prvok.
  5. Vytvorte výstupné pole rovnakej veľkosti ako vstupné pole.
  6. 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.
  7. Tabuľka výsledkov teraz obsahuje zoradené prvky.
Lineárne časové triedenie

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í

    Triedenie podľa počítania:Counting-Based je nekomparatívny triediaci algoritmus. Počíta výskyt každého konkrétneho prvku vo vstupnom poli a použije tieto informácie na určenie správnej polohy každého prvku v zoradenom výstupnom poli. Triedenie založené na počítaní predpokladá, že vstupné prvky sú celé čísla alebo ich možno k celým číslam pridať.

Algoritmy založené na Radixe

    Zoradiť Radix:Radix Sort je algoritmus triedenia nezaložený na porovnávaní, ktorý triedi prvky podľa ich čísel alebo znakov. Počíta každé číslo alebo znamienko v prvkoch od najmenej významného čísla po najvýznamnejšie Radikálne triedenie predpokladá, že vstupné prvky sú celé čísla alebo reťazce.Triedenie vedra:Bucket Sort je variant Radix Sort, ktorý rozdeľuje prvky do pevných skupín na základe ich rozsahu alebo distribúcie. Každý segment sa triedi samostatne pomocou iného triediaceho algoritmu alebo rekurzívneho triedenia bin-sort.MSD (Najvýznamnejšia číslica) Radix Zoradiť:MSD Radix Sort je variantom radixového triedenia, ktoré začína triediť prvky na základe ich najvýznamnejších. Rekurzívne rozdeľuje prvky do podskupín na základe hodnoty aktuálneho čísla a aplikuje MSD Radix Sort na každú podskupinu, kým nie sú spočítané všetky čísla.LSD (najmenej významná číslica) Radixové triedenie:LSD Radix Sort je ďalší variant, ktorý začína triediť prvky na základe ich najmenej významných hodnôt. Rekurzívne triedi prvky na základe každého čísla od krajného vpravo po krajný ľavý, čím vytvára zoradený výsledok. Algoritmy triedenia založené na počte aj na koreňoch dosahujú lineárnu časovú zložitosť využívaním špecifických vlastností vstupných prvkov, ako je ich rozsah alebo reprezentačná štruktúra (napr. čísla alebo znaky). Ich použiteľnosť sa však môže líšiť v závislosti od charakteristík vstupných údajov.

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.

    Efektívne pre veľké vstupné veľkosti:Časová zložitosť algoritmov lineárneho časového triedenia je O(n), čo znamená, že čas chodu sa zvyšuje lineárne so vstupnou veľkosťou. Vďaka tomu sú veľmi efektívne pre veľké súbory údajov v porovnaní s porovnávacími triediacimi algoritmami, ako sú algoritmy rýchleho triedenia alebo zlúčenia, ktoré majú zvyčajne časovú zložitosť O(n log n).Žiadne porovnávacie operácie:Algoritmy triedenia v lineárnom čase, ako napríklad triedenie podľa enumerácie, sa nespoliehajú na elementárne porovnanie Namiesto toho používajú špecifické atribúty alebo informácie o vstupných prvkoch, ako je ich rozsah alebo distribúcia. Táto vlastnosť ich robí výhodnými, keď sú náklady na porovnávanie vysoké, ako sú zložité objekty alebo drahé porovnávacie operácie.Vhodnosť pre špecifické vstupné vlastnosti:Algoritmy triedenia v lineárnom čase majú často špecifické požiadavky alebo predpoklady týkajúce sa vstupných prvkov. Ak chcete napríklad vypočítať poradie triedenia, musíte vopred poznať rozsah vstupných prvkov. Ak sú splnené tieto podmienky, algoritmy lineárneho triedenia podľa času môžu ponúkať významné výkonnostné výhody oproti všeobecným algoritmom triedenia.Stabilné zoradenie:Mnohé algoritmy triedenia v lineárnom čase, vrátane numerického a radixového triedenia, sú vo svojej podstate stabilné. Konzistencia znamená, že prvky s duplicitnými kľúčmi alebo hodnotami si zachovávajú relatívne poradie v zoradenom výstupe. To môže byť kritické pri triedení objektov alebo záznamov s viacerými atribútmi alebo keď je nevyhnutné zachovať pôvodné poradie prvkov rovnakej hodnoty.Jednoduchosť použitia:Algoritmy lineárneho triedenia, ako napríklad triedenie podľa počtu, sú často relatívne ľahko implementovateľné v porovnaní so zložitejšími triediacimi algoritmami založenými na porovnávaní. Môžu byť jednoduchšie na pochopenie a ladenie, vďaka čomu sú vhodné pre situácie, kde sa požaduje jednoduchosť a prehľadnosť.

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
    Obmedzujúce vstupné požiadavky:Algoritmy lineárneho časového triedenia majú často špecifické požiadavky alebo predpoklady týkajúce sa vstupných prvkov. Ak chcete napríklad vypočítať poradie triedenia, musíte vopred poznať rozsah vstupných prvkov. Toto obmedzenie obmedzuje ich uplatniteľnosť na situácie, keď sú tieto podmienky splnené. Požiadavky na pamäť sa môžu stať nepraktickými alebo presiahnuť dostupné zdroje, ak je rozsah rozsiahly alebo neznámy.Ďalšie požiadavky na priestor:Niektoré algoritmy lineárneho časového triedenia, ako napríklad numerické triedenie, vyžadujú dodatočný priestor na uloženie iných polí alebo dátových štruktúr. Potrebný priestor je často úmerný počtu vstupných prvkov. To môže byť nevýhodou, keď je problémom využitie pamäte, najmä ak ide o veľké súbory údajov alebo obmedzené pamäťové zdroje.Nedostatok všestrannosti:Algoritmy lineárneho triedenia sú špecializované algoritmy navrhnuté pre špecifické scenáre alebo obmedzenia. Možno budú musieť byť vhodnejšie a efektívnejšie pre všeobecné úlohy triedenia alebo rôzne distribúcie vstupov. Algoritmy triedenia založené na porovnávaní, ako je rýchle triedenie alebo zlúčenie, sú všestrannejšie a dokážu zvládnuť širší rozsah vstupného rozsahu.Neefektívne pre malé rozsahy alebo riedke údaje:Algoritmy triedenia v lineárnom čase, ako napríklad enumerácia, sú najúčinnejšie, keď je rozsah vstupných prvkov malý a husto distribuovaný. Ak je rozsah rozsiahly alebo sú údaje riedke (t. j. iba niekoľko odlišných hodnôt), algoritmus môže ušetriť čas a námahu pri spracovaní prázdnych alebo riedko zaplnených častí vstupného rozsahu.Obmedzené na konkrétne typy údajov:Algoritmy triedenia v lineárnom čase, ako napríklad triedenie podľa enumerácie, sú primárne navrhnuté na triedenie nezáporných celých čísel alebo objektov kľúč – hodnota. Nemusia byť vhodné na triedenie iných dátových typov, ako sú čísla s pohyblivou rádovou čiarkou, reťazce alebo zložité dátové štruktúry. Prispôsobenie algoritmov lineárneho časového triedenia na spracovanie rôznych typov údajov alebo vlastných porovnávacích funkcií môže vyžadovať dodatočné predbežné spracovanie alebo úpravy.

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:

    Triedenie celých čísel s malým rozsahom:Algoritmy triedenia podľa lineárneho času, ako je triedenie podľa počtu a triedenie podľa radixu, sú ideálne na triedenie polí celých čísel, keď je rozsah hodnôt Tieto algoritmy dosahujú lineárnu časovú zložitosť vytváraním predpokladov o vstupných údajoch, čo im umožňuje obísť triedenie založené na porovnaní.Triedenie podľa reťazcov:Algoritmy triedenia v lineárnom čase možno použiť aj na efektívne triedenie reťazcov. Použitím jedinečných vlastností reťazcov, ako je ich dĺžka alebo znaky, môžu algoritmy ako Radix Sort dosiahnuť lineárnu časovú zložitosť pri triedení reťazcov.Funkcie databázy:Triedenie je základnou funkciou lineárnych algoritmov triedenia v čase, ktoré dokážu efektívne triediť veľké súbory údajov na základe konkrétnych stĺpcov alebo polí. To umožňuje rýchlejšie spracovanie dotazov a lepší výkon v databázových operáciách.Vytváranie histogramov:Histogramy sú nevyhnutné pre rôzne štatistické úlohy a úlohy analýzy údajov. Algoritmy lineárneho časového triedenia, ako je numerické triedenie, môžu generovať histogramy efektívnym počítaním výskytov prvkov v súbore údajov.Externé triedenie:Technika externého triedenia sa používa v scenároch, kde sa údaje nezmestia úplne do pamäte. Algoritmy lineárneho časového triedenia, ako napríklad External Radix Sort alebo External Counting Sort, môžu efektívne triediť veľké súbory dát uložené na disku alebo iných externých úložných zariadeniach.Plánovanie udalosti:Algoritmy lineárneho triedenia podľa času môžu plánovať udalosti na základe časov ich začiatku alebo konca. Zoradenie udalostí vo vzostupnom poradí uľahčuje identifikáciu konfliktov, prekrývajúcich sa období alebo nájdenie ďalšieho dostupného obdobia.Analýza protokolových súborov:Analýza protokolových súborov je bežnou úlohou pri správe a ladení systému. Algoritmy lineárneho triedenia podľa času možno použiť na triedenie protokolov na základe časových pečiatok, čo uľahčuje identifikáciu vzorov, anomálií alebo vyhľadávanie konkrétnych udalostí.Kompresia údajov:Triedenie hrá zásadnú úlohu v rôznych technikách kompresie údajov. Algoritmy ako Burrows-Wheeler Transform (BWT) alebo Move-To-Front Transform (MTF) sa spoliehajú na lineárne časové usporiadanie na preusporiadanie údajov, aby sa zlepšila účinnosť kompresie. Toto je len niekoľko príkladov aplikácií lineárnych algoritmov triedenia v čase.

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&amp; 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&apos;s maximum value to determine the worksheet&apos;s size. It then counts each element&apos;s occurrence and calculates the worksheet&apos;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.