Johdanto
Lajittelu on tietojenkäsittelytieteen olennainen toimenpide, joka sisältää elementtien järjestämisen tiettyyn järjestykseen, kuten numeeriseen tai aakkosjärjestykseen. On kehitetty erilaisia lajittelualgoritmeja, joista jokaisessa on aika- ja tehokkuusindikaattorit. Lineaarinen aikalajittelu on lajittelualgoritmien osajoukko, jolla on merkittävä etu: ne voivat lajitella tietyn joukon elementtejä lineaarisessa ajassa, suoritusaika kasvaa lineaarisesti syötteen koon mukaan.
int merkkijonoon java
Tunnetuin lineaarinen aikalajittelualgoritmi on laskeva lajittelu. Laskennallinen lajittelu on erityisen tehokasta, kun syöteelementtien valikoima on tunnettu ja suhteellisen pieni. Tämä poistaa tarpeen vertailla elementtejä, mikä on tärkein aikaa vievä toimenpide monissa muissa lajittelualgoritmeissa. Syöttöaluetietoa käyttämällä laskennallinen lajittelu saavuttaa lineaarisen aikamonimutkaisuuden. Numeerinen lajittelu skannaa ensin syötetaulukon määrittääkseen kunkin elementin määrän. Sitten se laskee näiden numeroiden avulla elementtien oikeat sijainnit järjestetyssä tulostaulukossa. Algoritmi koostuu seuraavista vaiheista:
- Voit määrittää alueen määrittämällä syöttötaulukon minimi- ja enimmäisarvot.
- Luo laskentataulukko, joka on alustettu alueen koolla ja nollalla.
- Iteroi syöttötaulukon yli ja lisää jokaista löydettyä elementtiä.
- Muokkaa laskentataulukkoa laskemalla kumulatiivinen kokonaissumma saadaksesi kunkin elementin oikeat paikat.
- Luo tulotaulukko, joka on samankokoinen kuin syöttötaulukko.
- Siirrä syöttötaulukkoa uudelleen ja sijoita jokainen elementti oikeaan kohtaan tulostaulukossa laskentataulukon perusteella.
- Tulostaulukko sisältää nyt lajiteltuja elementtejä.
Laskevan lajittelun tärkein etu on, että se saavuttaa O(n) lineaarisen aikakompleksisuuden, mikä tekee siitä erittäin tehokkaan suurille syötekokoille. Sen sovellettavuus rajoittuu kuitenkin skenaarioihin, joissa syöteelementtien valinta on tiedossa etukäteen ja suhteellisen pieni.
On tärkeää huomata, että muiden lajittelualgoritmien, kuten pikalajittelun tai yhdistämisen, aikamonimutkaisuus on tyypillisesti O(n log n), jota pidetään tehokkaana monissa käytännön sovelluksissa. Lineaariset aikalajittelualgoritmit, kuten numeerinen lajittelu, tarjoavat vaihtoehdon, kun tietyt syötteen rajoitukset tai ominaisuudet sallivat lineaarisen aikamonimutkaisuuden käytön.
Historia
Lineaarisilla aikalajittelualgoritmeilla on rikas historia tietojenkäsittelytieteessä. Lineaarisen aikajärjestyksen kehittyminen voidaan jäljittää 1900-luvun puoliväliin asti, ja tiedemiesten ja matemaatikoiden panos oli merkittävä. Yksi varhaisimmista lineaarisista aikalajittelualgoritmeista on Harold H. Sewardin vuonna 1954 ehdottama sämpärilajittelu. Sämpärilajittelu jakaa syöteelementit rajalliseen määrään sämpylöitä ja lajittelee sitten jokaisen sämpön erikseen. Tällä algoritmilla on lineaarinen aikamonimutkaisuus, jos syöteelementtien jakautuminen on suhteellisen tasaista.
Vuonna 1959 Kenneth E. Iverson esitteli kantaluku-algoritmin, joka saavuttaa lineaarisen aikamonimutkaisuuden. Radix lajittelee elementit niiden numeroiden tai etumerkkien mukaan vähiten merkitsevistä merkittävimpiin. Se käyttää vankkoja lajittelualgoritmeja, kuten numeerista tai kauhalajittelua, lajitellakseen elementit kussakin numeropaikassa. Radix-lajittelusta tuli suosittu reikäkorttien ja varhaisten tietokonejärjestelmien aikakaudella. Tunnetuin lineaarinen aikalajittelualgoritmi on kuitenkin luettelointi, jonka Harold H. Seward ja Peter Elias esittelivät vuonna 1954 ja jonka Harold H. 'Bobby' Johnson löysi myöhemmin itsenäisesti uudelleen vuonna 1961. Numeerinen lajittelu on saanut paljon huomiota.
Tämä on erityisen tehokasta, kun syöttöelementtien valikoima on tunnettu ja suhteellisen pieni. Lineaarisen aikalajittelun historia jatkui muiden erikoisalgoritmien kehittämisen myötä. Esimerkiksi vuonna 1987 Hanan Samet ehdotti binäärijakaumapuun lajittelua, lineaarista aikalajittelualgoritmia moniulotteiselle datalle. Vuosien mittaan tutkijat ovat jatkaneet lineaaristen aikataulutusalgoritmien tutkimista ja parantamista keskittyen tiettyihin skenaarioihin ja rajoituksiin. Vaikka algoritmeja, kuten pikalajittelu ja yhdistäminen, käytetään laajemmin niiden tehokkuuden vuoksi useammissa skenaarioissa, lineaariajan lajittelualgoritmit tarjoavat arvokkaita vaihtoehtoja, kun tietyt olosuhteet sallivat lineaarisen ajan monimutkaisuuden hyödyntämisen. Yleisesti ottaen lineaarisen aikalajittelun historialle on ominaista sellaisten tehokkaiden algoritmien etsiminen, jotka pystyvät lajittelemaan suuria tietojoukkoja lineaarisessa ajassa ylittäen vertailupohjaisten lajittelualgoritmien rajoitukset. Eri tutkijoiden panokset tasoittivat tietä näiden erikoistuneiden lajittelutekniikoiden kehittämiselle ja ymmärtämiselle.
Lineaarisen aikalajittelun tyypit
On olemassa useita erilaisia lineaarisia aikalajittelualgoritmeja. Kaksi päätyyppiä ovat laskentaan perustuvat algoritmit ja kantalukupohjaiset algoritmit. Tässä ovat yleisimmät lineaariset aikalajittelualgoritmit, jotka on luokiteltu seuraavien tyyppien perusteella:
Laskentapohjaiset algoritmit
Radix-pohjaiset algoritmit
Lineaarisen aikalajittelun edut
Lineaariset aikalajittelualgoritmit, kuten numeerinen lajittelu, tarjoavat useita etuja tietyissä skenaarioissa.
Lineaarisen aikalajittelun haitat
Vaikka lineaarisilla ajoitusalgoritmeilla on etunsa, niillä on myös tiettyjä rajoituksia ja haittoja:
Lajittelualgoritmia valittaessa on oleellista ottaa tarkasti huomioon syötetietojen erityispiirteet ja lajitteluongelman vaatimukset. Vaikka lineaariset ajoitusalgoritmit tarjoavat etuja tietyissä skenaarioissa, ne ovat vain toisinaan sopivin tai tehokkain valinta.
Lineaaristen aikalajittelualgoritmien sovellukset
Lineaariset aikalajittelualgoritmit ovat tehokkaita ja niillä on monia sovelluksia eri aloilla. Tässä on joitain tyypillisiä lineaarisen aikajärjestyksen sovelluksia:
Lineaarisen aikalajittelun toteutus C++:ssa
Tässä on esimerkki ohjelmasta, joka toteuttaa Counting Sort -toiminnon, joka on lineaarinen aikalajittelualgoritmi:
#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();>
Tämä osoittaa, että syötetaulukko on lajiteltu nousevaan järjestykseen käyttämällä Counting Sort -algoritmia, jolloin tuloksena on lajiteltu matriisi [1, 2, 2, 3, 3, 4, 8].
Tässä C++-ohjelmassa laskenta-lajittelutoiminto ottaa viittauksen vektoriin arr ja suorittaa laskevan lajittelurutiinin. Se löytää taulukon enimmäisarvon määrittääkseen laskentataulukon koon. Sitten se laskee kunkin elementin esiintymisen ja laskee laskentataulukon etuliitesumman. Sitten se luo tulosvektorin ja asettaa elementit laskentataulukon mukaiseen järjestykseen. Lopuksi se kopioi lajitellut elementit takaisin alkuperäiseen taulukkoon. Ensisijaisessa funktiossa esimerkkitaulukko {4, 2, 2, 8, 3, 3, 1} lajitellaan numeroinnin lajittelualgoritmin mukaan ja tulostetaan lajiteltuna matriisina. Huomaa, että ohjelma käyttää kirjastoja työskennelläkseen vektorien kanssa ja löytääkseen taulukon maksimielementin käyttämällä max_element-funktiota.