logo

Liniowe sortowanie według czasu

Wstęp

Sortowanie to podstawowa operacja w informatyce, która polega na układaniu elementów w określoną kolejność, na przykład numeryczną lub alfabetyczną. Opracowano różne algorytmy sortowania, każdy ze wskaźnikami czasu i wydajności. Liniowe sortowanie po czasie to podzbiór algorytmów sortowania mający istotną zaletę: mogą sortować dany zbiór elementów w czasie liniowym, a czas wykonania rośnie liniowo wraz z rozmiarem danych wejściowych.

Najbardziej znanym algorytmem sortowania liniowego według czasu jest sortowanie malejące. Sortowanie obliczeniowe jest szczególnie efektywne, gdy zakres elementów wejściowych jest znany i stosunkowo niewielki. Eliminuje to potrzebę porównywania elementów, co jest główną czasochłonną operacją w wielu innych algorytmach sortowania. Wykorzystując wiedzę z dziedziny wejściowej, sortowanie obliczeniowe osiąga liniową złożoność czasową. Sortowanie numeryczne najpierw skanuje tablicę wejściową, aby określić liczbę każdego elementu. Następnie wykorzystuje te liczby do obliczenia prawidłowych pozycji elementów w uporządkowanej tabeli wyników. Algorytm składa się z następujących kroków:

  1. Aby określić zakres, należy określić minimalne i maksymalne wartości tablicy wejściowej.
  2. Utwórz arkusz zainicjowany rozmiarem zakresu i zerami.
  3. Wykonaj iterację po tablicy wejściowej i zwiększ każdy znaleziony element.
  4. Zmodyfikuj arkusz, obliczając skumulowaną sumę, aby uzyskać prawidłowe pozycje dla każdego elementu.
  5. Utwórz tablicę wyjściową o tym samym rozmiarze co tablica wejściowa.
  6. Przesuń ponownie tablicę wejściową, umieszczając każdy element we właściwej pozycji w tablicy wyjściowej na podstawie arkusza.
  7. Tabela wyników zawiera teraz posortowane elementy.
Liniowe sortowanie według czasu

Główną zaletą sortowania malejącego jest to, że osiąga on liniową złożoność czasową O(n), co czyni go bardzo wydajnym w przypadku dużych rozmiarów danych wejściowych. Jednakże jego zastosowanie ogranicza się do scenariuszy, w których wybór elementów wejściowych jest znany z góry i stosunkowo niewielki.

Należy zauważyć, że inne algorytmy sortowania, takie jak szybkie sortowanie lub łączenie, mają zazwyczaj złożoność czasową O(n log n), co jest uważane za efektywne w wielu praktycznych zastosowaniach. Algorytmy liniowego sortowania według czasu, takie jak sortowanie numeryczne, stanowią alternatywę, gdy pewne ograniczenia lub właściwości danych wejściowych pozwalają na zastosowanie liniowej złożoności czasowej.

Historia

Algorytmy liniowego sortowania według czasu mają bogatą historię w informatyce. Rozwój liniowego porządku czasu datuje się na połowę XX wieku, a wkład naukowców i matematyków był znaczący. Jednym z najwcześniejszych algorytmów sortowania według czasu liniowego jest sortowanie segmentowe, zaproponowane przez Harolda H. Sewarda w 1954 roku. Sortowanie segmentowe dzieli elementy wejściowe na skończoną liczbę segmentów, a następnie sortuje każdy segment osobno. Algorytm ten ma liniową złożoność czasową, jeśli rozkład elementów wejściowych jest stosunkowo równomierny.

mapa skrótów Java

W 1959 roku Kenneth E. Iverson wprowadził algorytm radix, który osiąga liniową złożoność czasową. Radix sortuje elementy według ich numerów lub znaków od najmniej znaczącego do najbardziej znaczącego. Wykorzystuje niezawodne algorytmy sortowania, takie jak sortowanie numeryczne lub sortowanie segmentowe, aby sortować elementy w miejscu każdej cyfry. Sortowanie metodą Radix stało się popularne w epoce kart dziurkowanych i wczesnych systemów komputerowych. Jednak najbardziej znanym algorytmem sortowania liniowego według czasu jest wyliczenie, wprowadzone przez Harolda H. Sewarda i Petera Eliasa w 1954 r., a później niezależnie odkryte ponownie przez Harolda H. „Bobby'ego” Johnsona w 1961 r. Sortowanie numeryczne wzbudziło duże zainteresowanie.

Jest to szczególnie skuteczne, gdy zakres elementów wejściowych jest znany i stosunkowo niewielki. Historia liniowego sortowania według czasu była kontynuowana wraz z rozwojem innych wyspecjalizowanych algorytmów. Na przykład w 1987 roku Hanan Samet zaproponował sortowanie drzewa dystrybucji binarnej, algorytm sortowania liniowego po czasie dla danych wielowymiarowych. Przez lata badacze kontynuowali badania i udoskonalanie algorytmów planowania liniowego, koncentrując się na konkretnych scenariuszach i ograniczeniach. Chociaż algorytmy takie jak szybkie sortowanie i łączenie są szerzej stosowane ze względu na swoją wydajność w większej liczbie scenariuszy, algorytmy sortowania w czasie liniowym stanowią cenną alternatywę, gdy pewne okoliczności pozwalają na wykorzystanie złożoności czasu liniowego. Ogólnie rzecz biorąc, historia liniowego sortowania według czasu charakteryzuje się poszukiwaniem wydajnych algorytmów, które mogą sortować duże zbiory danych w czasie liniowym, przezwyciężając ograniczenia algorytmów sortowania opartego na porównaniach. Wkład różnych badaczy utorował drogę do opracowania i zrozumienia tych specjalistycznych technik sortowania.

Rodzaje liniowego sortowania według czasu

Istnieje kilka różnych algorytmów sortowania liniowego według czasu. Dwa główne typy to algorytmy oparte na liczbie i algorytmy oparte na podstawie. Oto najpopularniejsze algorytmy sortowania według czasu liniowego, sklasyfikowane w oparciu o następujące typy:

Algorytmy oparte na zliczaniu

    Sortowanie na podstawie zliczania:Counting-Based to algorytm sortowania nieporównawczego. Zlicza występowanie każdego konkretnego elementu w tablicy wejściowej i wykorzystuje te informacje do określenia prawidłowej pozycji każdego elementu w posortowanej tablicy wyjściowej. Sortowanie oparte na zliczaniu zakłada, że ​​elementy wejściowe są liczbami całkowitymi lub można je dodać do liczb całkowitych.

Algorytmy oparte na podstawce

    Sortuj Radix:Sortowanie Radix to algorytm sortowania nieoparty na porównaniu, który sortuje elementy według ich liczb lub znaków. Zlicza każdą liczbę lub znak w elementach od najmniej znaczącej liczby do najbardziej znaczącej. Sortowanie radykalne zakłada, że ​​elementy wejściowe są liczbami całkowitymi lub ciągami znaków.Sortowanie wiadro:Sortowanie kubełkowe to odmiana sortowania radiacyjnego, która dzieli elementy na stałe grupy na podstawie ich zakresu lub rozkładu. Każdy segment jest sortowany osobno przy użyciu innego algorytmu sortowania lub sortowania rekurencyjnego.MSD (najbardziej znacząca cyfra) Sortowanie radiacyjne:MSD Radix Sort to odmiana sortowania radix, która rozpoczyna sortowanie elementów na podstawie ich najbardziej znaczących. Rekurencyjnie dzieli elementy na podgrupy w oparciu o wartość bieżącej liczby i stosuje MSD Radix Sort do każdej podgrupy, aż wszystkie liczby zostaną zliczone.Sortowanie radiacyjne LSD (najmniej znacząca cyfra):LSD Radix Sort to kolejny wariant, który rozpoczyna sortowanie elementów w oparciu o ich najmniej znaczące. Rekurencyjnie sortuje elementy w oparciu o każdą liczbę od skrajnej prawej do lewej strony, dając posortowany wynik. Zarówno algorytmy sortowania oparte na liczbie, jak i na pierwiastkach osiągają liniową złożoność czasową, wykorzystując określone właściwości elementów wejściowych, takie jak ich zakres lub struktura reprezentacji (np. Liczby lub znaki). Jednakże ich zastosowanie może się różnić w zależności od charakterystyki danych wejściowych.

Zalety liniowego sortowania według czasu

Algorytmy liniowego sortowania według czasu, takie jak sortowanie numeryczne, oferują kilka zalet w określonych scenariuszach.

    Efektywne w przypadku dużych rozmiarów danych wejściowych:Złożoność czasowa algorytmów liniowego sortowania po czasie wynosi O(n), co oznacza, że ​​czas działania rośnie liniowo wraz z rozmiarem danych wejściowych. To sprawia, że ​​są bardzo wydajne w przypadku dużych zbiorów danych w porównaniu z algorytmami sortowania opartymi na porównaniach, takimi jak algorytmy szybkiego sortowania lub scalania, które zazwyczaj mają złożoność czasową O(n log n).Brak operacji porównawczych:Algorytmy sortowania w czasie liniowym, takie jak sortowanie wyliczeniowe, nie opierają się na elementarnym porównaniu. Zamiast tego wykorzystują określone atrybuty lub informacje o elementach wejściowych, takie jak ich zakres lub rozkład. Ta cecha czyni je korzystnymi, gdy koszt porównania jest wysoki, na przykład w przypadku złożonych obiektów lub kosztownych operacji porównawczych.Przydatność do określonych właściwości wejściowych:Algorytmy sortowania w czasie liniowym często mają określone wymagania lub założenia dotyczące elementów wejściowych. Na przykład, aby obliczyć kolejność sortowania, należy wcześniej poznać zakres elementów wejściowych. Gdy te warunki są spełnione, algorytmy sortowania według czasu liniowego mogą oferować znaczną przewagę wydajnościową w porównaniu z ogólnymi algorytmami sortowania.Sortowanie stabilne:Wiele algorytmów sortowania w czasie liniowym, w tym sortowanie numeryczne i sortowanie radix, jest z natury stabilnych. Spójność oznacza, że ​​elementy ze zduplikowanymi kluczami lub wartościami zachowują względny porządek w posortowanych wynikach. Może to mieć kluczowe znaczenie podczas sortowania obiektów lub rekordów z wieloma atrybutami lub gdy istotne jest zachowanie oryginalnej kolejności elementów o równej wartości.Łatwość użycia:Algorytmy sortowania liniowego według czasu, takie jak sortowanie wyliczeniowe, są często stosunkowo łatwe do wdrożenia w porównaniu z bardziej złożonymi algorytmami sortowania opartego na porównaniach. Mogą być łatwiejsze do zrozumienia i debugowania, dzięki czemu nadają się do sytuacji, w których pożądana jest prostota i przejrzystość.

Wady liniowego sortowania według czasu

Chociaż algorytmy planowania liniowego mają swoje zalety, mają również pewne ograniczenia i wady:

    Ograniczające wymagania wejściowe:Algorytmy sortowania liniowego według czasu często mają określone wymagania lub założenia dotyczące elementów wejściowych. Na przykład, aby obliczyć kolejność sortowania, należy wcześniej poznać zakres elementów wejściowych. To ograniczenie ogranicza ich zastosowanie do sytuacji, w których te warunki są spełnione. Wymagania dotyczące pamięci mogą stać się niepraktyczne lub przekraczać dostępne zasoby, jeśli zakres jest obszerny lub nieznany.Dodatkowe wymagania przestrzenne:Niektóre algorytmy sortowania według czasu liniowego, takie jak sortowanie numeryczne, wymagają dodatkowej przestrzeni do przechowywania innych tablic lub struktur danych. Wymagana przestrzeń jest często proporcjonalna do liczby elementów wejściowych. Może to być wadą, gdy problemem jest wykorzystanie pamięci, szczególnie w przypadku dużych zbiorów danych lub ograniczonych zasobów pamięci.Brak wszechstronności:Algorytmy sortowania liniowego według czasu to wyspecjalizowane algorytmy zaprojektowane dla określonych scenariuszy lub ograniczeń. Być może muszą być bardziej odpowiednie i wydajne w przypadku ogólnych zadań sortowania lub różnych dystrybucji danych wejściowych. Algorytmy sortowania oparte na porównaniach, takie jak szybkie sortowanie lub scalanie, są bardziej wszechstronne i mogą obsługiwać szerszy zakres zakresu wejściowego.Nieefektywne w przypadku małych zakresów lub rzadkich danych:Algorytmy sortowania w czasie liniowym, takie jak wyliczanie, są najskuteczniejsze, gdy zakres elementów wejściowych jest mały i gęsto rozmieszczony. Jeśli zakres jest obszerny lub dane są rzadkie (tj. tylko kilka odrębnych wartości), algorytm może zaoszczędzić czas i wysiłek, przetwarzając puste lub słabo zapełnione części zakresu wejściowego.Ograniczone do określonych typów danych:Algorytmy sortowania w czasie liniowym, takie jak sortowanie wyliczeniowe, są przeznaczone głównie do sortowania nieujemnych liczb całkowitych lub obiektów klucz-wartość. Mogą nie nadawać się do sortowania innych typów danych, takich jak liczby zmiennoprzecinkowe, ciągi znaków lub złożone struktury danych. Dostosowanie algorytmów sortowania według czasu liniowego do obsługi różnych typów danych lub niestandardowych funkcji porównawczych może wymagać dodatkowego przetwarzania wstępnego lub modyfikacji.

Wybierając algorytm sortowania, należy dokładnie rozważyć specyfikę danych wejściowych i wymagania problemu sortowania. Chociaż algorytmy planowania liniowego oferują zalety w określonych scenariuszach, tylko czasami są najbardziej odpowiednim i efektywnym wyborem.

filtrowanie Pythona

Zastosowania algorytmów sortowania liniowego po czasie

Algorytmy sortowania liniowego po czasie są wydajne i mają wiele zastosowań w różnych dziedzinach. Oto kilka typowych zastosowań liniowego porządku czasu:

    Sortowanie liczb całkowitych z małego zakresu:Liniowe algorytmy sortowania według czasu, takie jak sortowanie przez liczbę i sortowanie przez podstawę, idealnie nadają się do sortowania tablic liczb całkowitych, gdy zakres wartości wynosi. Algorytmy te osiągają liniową złożoność czasową poprzez przyjęcie założeń dotyczących danych wejściowych, co pozwala im ominąć sortowanie oparte na porównaniach.Sortowanie ciągów:Do wydajnego sortowania ciągów można również zastosować algorytmy sortowania liniowego według czasu. Biorąc unikalne właściwości ciągów, takie jak ich długość lub liczba znaków, algorytmy takie jak Radix Sort mogą osiągnąć liniową złożoność czasową podczas sortowania ciągów.Funkcje bazy danych:Sortowanie jest podstawową funkcją liniowego sortowania według czasu. Algorytmy sortowania pozwalają efektywnie sortować duże zbiory danych w oparciu o określone kolumny lub pola. Umożliwia to szybsze przetwarzanie zapytań i lepszą wydajność operacji na bazach danych.Tworzenie histogramów:Histogramy są niezbędne do różnych zadań statystycznych i analizy danych. Algorytmy sortowania liniowego według czasu, takie jak sortowanie numeryczne, mogą generować histogramy poprzez efektywne zliczanie wystąpień elementów w zbiorze danych.Sortowanie zewnętrzne:Technikę sortowania zewnętrznego stosuje się w scenariuszach, w których dane nie mieszczą się w całości w pamięci. Liniowe algorytmy sortowania według czasu, takie jak zewnętrzne sortowanie radiacyjne lub zewnętrzne sortowanie zliczające, umożliwiają efektywne sortowanie dużych zbiorów danych przechowywanych na dysku lub innych zewnętrznych urządzeniach pamięci masowej.Harmonogram wydarzeń:Algorytmy liniowego sortowania czasu mogą planować zdarzenia na podstawie czasu ich rozpoczęcia lub zakończenia. Sortowanie zdarzeń w kolejności rosnącej ułatwia identyfikację konfliktów, nakładających się okresów lub znalezienie następnego dostępnego okresu.Analizowanie plików dziennika:Analizowanie plików dziennika jest częstym zadaniem podczas administrowania systemem i debugowania. Algorytmy liniowego sortowania według czasu można wykorzystać do sortowania logów na podstawie znaczników czasu, co ułatwia identyfikację wzorców, anomalii lub wyszukiwanie konkretnych zdarzeń.Kompresja danych:Sortowanie odgrywa zasadniczą rolę w różnych technikach kompresji danych. Algorytmy takie jak transformacja Burrowsa-Wheelera (BWT) lub transformacja Move-To-Front (MTF) opierają się na liniowym uporządkowaniu czasu w celu zmiany kolejności danych w celu poprawy wydajności kompresji. To tylko kilka przykładów zastosowań algorytmów sortowania liniowego po czasie.

Implementacja liniowego sortowania według czasu w C++

Oto przykład programu implementującego sortowanie zliczające, które jest algorytmem sortowania liniowego według czasu:

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

Oznacza to, że tablica wejściowa została posortowana w kolejności rosnącej przy użyciu algorytmu sortowania zliczającego, w wyniku czego otrzymano posortowaną tablicę [1, 2, 2, 3, 3, 4, 8].

W tym programie w języku C++ funkcja sortowania zliczającego przyjmuje odwołanie do wektora arr i uruchamia procedurę sortowania zliczającego. Znajduje maksymalną wartość tabeli, aby określić rozmiar arkusza. Następnie zlicza występowanie każdego elementu i oblicza sumę przedrostków arkusza. Następnie tworzy wektor wynikowy i porządkuje elementy zgodnie z arkuszem. Na koniec kopiuje posortowane elementy z powrotem do oryginalnej tablicy. W funkcji podstawowej przykładowa tablica {4, 2, 2, 8, 3, 3, 1} jest sortowana według algorytmu sortowania przez wyliczenie i wyświetlana jako posortowana macierz. Należy pamiętać, że program wykorzystuje biblioteki do pracy z wektorami i znajdowania maksymalnego elementu tablicy za pomocą funkcji max_element.