logo

Линеарно сортирање времена

Увод

Сортирање је суштинска операција у рачунарској науци која укључује сређивање елемената по одређеном редоследу, као што је нумерички или абецедни редослед. Развијени су различити алгоритми за сортирање, сваки са индикаторима времена и ефикасности. Линеарно сортирање по времену је подскуп алгоритама за сортирање са значајном предношћу: они могу сортирати дати скуп елемената у линеарном времену, време извођења расте линеарно са величином улаза.

Најпознатији алгоритам линеарног временског сортирања је опадајуће сортирање. Рачунарско сортирање је посебно ефикасно када је опсег улазних елемената познат и релативно мали. Ово елиминише потребу за упоређивањем елемената, што је главна операција која одузима много времена у многим другим алгоритмима за сортирање. Користећи знање о улазном домену, рачунарско сортирање постиже линеарну временску сложеност. Нумеричко сортирање прво скенира улазни низ да би одредило број сваког елемента. Затим користи ове бројеве за израчунавање тачних позиција елемената у табели са наређеним резултатима. Алгоритам се састоји од следећих корака:

  1. Да бисте одредили опсег, идентификујте минималне и максималне вредности улазног низа.
  2. Направите радни лист иницијализован величином опсега и нулама.
  3. Пређите преко улазног низа и повећајте сваки пронађени елемент.
  4. Измените радни лист тако што ћете израчунати збир да бисте добили тачне позиције за сваки елемент.
  5. Креирајте излазни низ исте величине као и улазни низ.
  6. Поново померите улазни низ, постављајући сваки елемент на исправан положај у излазном низу на основу радног листа.
  7. Табела резултата сада садржи сортиране елементе.
Линеарно сортирање времена

Главна предност опадајућег сортирања је да постиже линеарну временску сложеност од О(н), што га чини веома ефикасним за велике улазне величине. Међутим, његова примењивост је ограничена на сценарије где је избор улазних елемената унапред познат и релативно мали.

Важно је напоменути да други алгоритми за сортирање, као што су брзо сортирање или спајање, обично имају временску сложеност од О(н лог н), што се сматра ефикасним за многе практичне примене. Алгоритми линеарног временског сортирања, као што је нумеричко сортирање, пружају алтернативу када одређена ограничења или својства улаза дозвољавају коришћење линеарне временске сложености.

Историја

Алгоритми за линеарно временско сортирање имају богату историју у рачунарској науци. Развој линеарног временског поретка може се пратити до средине 20. века, а доприноси научника и математичара били су значајни. Један од најранијих алгоритама за линеарно временско сортирање је сортирање буцкет-а, које је предложио Харолд Х. Севард 1954. Буцкет сорт дели улазне елементе на коначан број буцкета, а затим сортира сваку канту посебно. Овај алгоритам има линеарну временску сложеност ако је дистрибуција улазних елемената релативно уједначена.

Године 1959. Кенет Е. Ајверсон је увео радикс алгоритам који постиже линеарну временску сложеност. Радик сортира елементе по броју или знацима од најмање значајног до најзначајнијег. Користи робусне алгоритме за сортирање, као што је нумеричко или буцкет сортирање, за сортирање елемената на свакој цифреној локацији. Радик сортирање је постало популарно у ери бушених картица и раних рачунарских система. Међутим, најпознатији линеарни алгоритам за временско сортирање је набрајање, које су увели Харолд Х. Севард и Петер Елиас 1954. године, а касније га је независно поново открио Харолд Х. 'Бобби' Јохнсон 1961. Нумеричко сортирање је добило значајну пажњу.

бројеви азбуке

Ово је посебно ефикасно када је опсег улазних елемената познат и релативно мали. Историја линеарног временског сортирања настављена је развојем других специјализованих алгоритама. На пример, 1987. Ханан Самет је предложио сортирање бинарног стабла дистрибуције, линеарни алгоритам за сортирање по времену за вишедимензионалне податке. Током година, истраживачи су наставили да проучавају и побољшавају алгоритме линеарног планирања, фокусирајући се на специфичне сценарије и ограничења. Иако се алгоритми као што су брзо сортирање и спајање више користе због своје ефикасности у више сценарија, алгоритми за сортирање по линеарном времену пружају вредне алтернативе када одређене околности дозвољавају да се искористи комплексност линеарног времена. Уопштено говорећи, историју линеарног временског сортирања карактерише тражење ефикасних алгоритама који могу сортирати велике скупове података у линеарном времену, превазилазећи ограничења алгоритама сортирања заснованих на поређењу. Доприноси различитих истраживача утрли су пут за развој и разумевање ових специјализованих техника сортирања.

Врсте линеарног временског сортирања

Постоји неколико различитих алгоритама линеарног временског сортирања. Два главна типа су алгоритми засновани на бројању и алгоритми засновани на радиксу. Ево најчешћих алгоритама линеарног сортирања времена, класификованих на основу следећих типова:

Алгоритми засновани на бројању

    Сортирање на основу бројања:Цоунтинг-Басед је неупоредни алгоритам за сортирање. Он броји појаву сваког одређеног елемента у улазном низу и користи ове информације да одреди тачан положај сваког елемента у сортираном излазном низу. Сортирање засновано на бројању претпоставља да су улазни елементи цели бројеви или да се могу додати целим бројевима.

Алгоритми засновани на радиксу

    Радик сортирања:Радик Сорт је алгоритам за сортирање без поређења који сортира елементе по бројевима или знаковима. Броји сваки број или знак у елементима од најмање значајног броја до најзначајнијег. Радикално сортирање претпоставља да су улазни елементи цели бројеви или низови.Сортирање кашике:Буцкет Сорт је варијанта Радик Сорт-а која дели елементе у фиксне групе на основу њиховог опсега или дистрибуције. Сваки сегмент се посебно сортира коришћењем различитог алгоритма сортирања или рекурзивног сортирања.МСД (најзначајнија цифра) Радик сортирање:МСД Радик Сорт је варијанта радик сортирања која почиње сортирање елемената на основу њихових најзначајнијих. Рекурзивно дели елементе у подгрупе на основу вредности тренутног броја и примењује МСД Радик Сорт на сваку подгрупу док се сви бројеви не преброје.ЛСД (најмање значајна цифра) Радик Сортирање:ЛСД Радик Сорт је још једна варијанта која почиње сортирање елемената на основу њиховог најмањег значаја. Рекурзивно сортира елементе на основу сваког броја од крајњег десног до крајњег лево, дајући сортирани резултат. И алгоритми за сортирање засновани на бројању и на корену постижу линеарну временску сложеност искоришћавањем специфичних својстава улазних елемената, као што су њихов опсег или репрезентативна структура (нпр. бројеви или знакови). Међутим, њихова примењивост може да варира у зависности од карактеристика улазних података.

Предности линеарног временског сортирања

Алгоритми линеарног временског сортирања, као што је нумеричко сортирање, нуде неколико предности у специфичним сценаријима.

    Ефикасан за велике улазне величине:Временска сложеност алгоритама линеарног временског сортирања је О(н), што значи да време рада расте линеарно са величином улаза. Ово их чини веома ефикасним за велике скупове података у поређењу са алгоритмима за сортирање заснованим на поређењу, као што су алгоритми брзог сортирања или спајања, који обично имају временску сложеност од О(н лог н).Нема операција поређења:Алгоритми за сортирање по линеарном времену, као што је сортирање набрајања, не ослањају се на елементарно поређење. Уместо тога, они користе специфичне атрибуте или информације о улазним елементима, као што су њихов опсег или дистрибуција. Ова карактеристика их чини повољним када су трошкови поређења високи, као што су сложени објекти или скупе операције поређења.Погодност за одређена својства уноса:Алгоритми за сортирање по линеарном времену често имају специфичне захтеве или претпоставке о улазним елементима. На пример, да бисте израчунали редослед сортирања, морате унапред знати опсег улазних елемената. Када су ови услови испуњени, алгоритми линеарног временског сортирања могу понудити значајне предности у перформансама у односу на опште алгоритме за сортирање.Стабилна сорта:Многи алгоритми за сортирање у линеарном времену, укључујући нумеричко и радикс сортирање, су инхерентно стабилни. Конзистентност значи да елементи са дуплираним кључевима или вредностима одржавају релативни ред у сортираном излазу. Ово може бити критично када се сортирају објекти или записи са више атрибута или када је од суштинског значаја очување оригиналног редоследа елемената једнаке вредности.Лакоћа коришћења:Алгоритми линеарног временског сортирања, као што је сортирање набрајања, често су релативно лаки за имплементацију у поређењу са сложенијим алгоритмима за сортирање заснованим на поређењу. Они могу бити лакши за разумевање и отклањање грешака, што их чини погодним за ситуације у којима се жели једноставност и јасноћа.

Недостаци линеарног временског сортирања

Иако алгоритми линеарног планирања имају своје предности, они такође имају одређена ограничења и недостатке:

    Ограничавајући захтеви за унос:Алгоритми за линеарно временско сортирање често имају специфичне захтеве или претпоставке о улазним елементима. На пример, да бисте израчунали редослед сортирања, морате унапред знати опсег улазних елемената. Ово ограничење ограничава њихову применљивост на ситуације у којима су ови услови испуњени. Захтеви за меморијом могу постати непрактични или премашити доступне ресурсе ако је опсег опсежан или непознат.Додатни захтеви за простор:Неки алгоритми за линеарно временско сортирање, као што је нумеричко сортирање, захтевају додатни простор за складиштење других низова или структура података. Потребан простор је често пропорционалан броју улазних елемената. Ово може бити недостатак када је употреба меморије проблем, посебно када се ради о великим скуповима података или ограниченим меморијским ресурсима.Недостатак свестраности:Алгоритми линеарног временског сортирања су специјализовани алгоритми дизајнирани за специфичне сценарије или ограничења. Можда ће морати да буду прикладнији и ефикаснији за опште задатке сортирања или различите дистрибуције улаза. Алгоритми за сортирање засновани на поређењу као што су брзо сортирање или спајање су свестранији и могу да обрађују шири опсег уноса.Неефикасно за мале опсеге или ретке податке:Алгоритми за сортирање у линеарном времену као што је набрајање су најефикаснији када је опсег улазних елемената мали и густо распоређен. Ако је опсег опсежан или су подаци ретки (тј., само неколико различитих вредности), алгоритам може уштедети време и труд за обраду празних или ретко насељених делова опсега уноса.Ограничено на специфичне типове података:Алгоритми за сортирање по линеарном времену, као што је сортирање набрајања, првенствено су дизајнирани да сортирају ненегативне целе бројеве или објекте кључ/вредност. Можда нису погодни за сортирање других типова података, као што су бројеви са помичним зарезом, стрингови или сложене структуре података. Прилагођавање алгоритама линеарног временског сортирања за руковање различитим типовима података или прилагођеним функцијама поређења може захтевати додатну претходну обраду или модификације.

Када бирате алгоритам за сортирање, неопходно је пажљиво размотрити специфичности улазних података и захтеве проблема сортирања. Док алгоритми линеарног планирања нуде предности у специфичним сценаријима, они су само понекад најприкладнији или најефикаснији избор.

Примене алгоритама линеарног временског сортирања

Алгоритми за линеарно временско сортирање су ефикасни и имају много примена у различитим областима. Ево неких типичних примена линеарног временског реда:

    Сортирање целих бројева малог опсега:Алгоритми за линеарно временско сортирање, као што су сортирање по броју и по радик сортирању, идеални су за сортирање низова целих бројева када је опсег вредности. Ови алгоритми постижу линеарну временску сложеност дајући претпоставке о улазним подацима, омогућавајући им да заобиђу сортирање засновано на поређењу.Сортирање низова:Алгоритми линеарног временског сортирања се такође могу применити на ефикасно сортирање стрингова. Узимајући јединствена својства стрингова, као што су њихова дужина или карактери, алгоритми као што је Радик Сорт могу постићи линеарну временску сложеност приликом сортирања стрингова.Функције базе података:Сортирање је суштинска функција линеарног временског сортирања алгоритама може ефикасно сортирати велике скупове података на основу одређених колона или поља. Ово омогућава бржу обраду упита и боље перформансе у операцијама базе података.Прављење хистограма:Хистограми су неопходни за различите задатке статистике и анализе података. Алгоритми линеарног временског сортирања, као што је нумеричко сортирање, могу генерисати хистограме ефикасним бројањем појављивања елемената у скупу података.Екстерно сортирање:Техника екстерног сортирања се користи у сценаријима где подаци не могу у потпуности да стану у меморију. Алгоритми за линеарно временско сортирање као што су екстерно радикс сортирање или екстерно сортирање бројањем могу ефикасно сортирати велике скупове података ускладиштене на диску или другим спољним уређајима за складиштење.Распоред догађаја:Алгоритми за линеарно сортирање времена могу планирати догађаје на основу њиховог времена почетка или завршетка. Сортирање догађаја у растућем редоследу олакшава идентификовање сукоба, преклапања периода или проналажење следећег доступног периода.Анализирање датотека евиденције:Анализа датотека евиденције је уобичајен задатак у системској администрацији и отклањању грешака. Алгоритми линеарног временског сортирања могу се користити за сортирање дневника на основу временских ознака, што олакшава идентификацију образаца, аномалија или тражење одређених догађаја.Компресија података:Сортирање игра битну улогу у различитим техникама компресије података. Алгоритми као што су Бурровс-Вхеелер Трансформ (БВТ) или Мове-То-Фронт Трансформ (МТФ) ослањају се на линеарно временско поређање за преуређивање података како би се побољшала ефикасност компресије. Ово је само неколико примера примене алгоритама линеарног временског сортирања.

Имплементација линеарног временског сортирања у Ц++

Ево примера програма који имплементира Цоунтинг Сорт, што је линеарни алгоритам за сортирање времена:

 #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();>

Ово указује да је улазни низ сортиран у растућем редоследу коришћењем алгоритма Цоунтинг Сорт, што је резултирало сортираним низом [1, 2, 2, 3, 3, 4, 8].

У овом Ц++ програму, функција сортирања бројањем узима референцу на вектор арр и покреће рутину сортирања бројања. Проналази максималну вредност табеле да би одредио величину радног листа. Затим броји појављивање сваког елемента и израчунава збир префикса радног листа. Затим креира вектор резултата и поставља елементе у ред према радном листу. Коначно, копира сортиране елементе назад у оригинални низ. У примарној функцији, пример низа {4, 2, 2, 8, 3, 3, 1} се сортира помоћу алгоритма сортирања набрајања и штампа као сортирана матрица. Имајте на уму да програм користи библиотеке за рад са векторима и проналажење максималног елемента низа помоћу функције мак_елемент.