Algoritmo di ordinamento radicale nella struttura dei dati

โšก Riepilogo intelligente

Radix Sort รจ un algoritmo di ordinamento lineare non comparativo che raggruppa gli interi in base alla posizione delle cifre, utilizzando una subroutine stabile come il counting sort. Ordina numeri, stringhe e chiavi a larghezza fissa piรน velocemente degli algoritmi di ordinamento basati sul confronto per molti tipi di input.

  • ๐ŸŽฏ Idea centrale: L'algoritmo Radix Sort elabora ogni cifra di ogni elemento dalla meno significativa alla piรน significativa, distribuendo i valori in gruppi e ricomponendo l'array a ogni passaggio.
  • โš™๏ธ Sottoprogramma stabile: Un algoritmo di ordinamento interno stabile, come il counting sort, preserva l'ordine precedente delle cifre uguali, elemento essenziale affinchรฉ il risultato finale sia completamente ordinato.
  • ๐Ÿงญ Esempio pratico: Tre iterazioni sull'array {162, 623, 835, 415, 248} sulle colonne delle unitร , delle decine e delle centinaia producono l'output ordinato {162, 248, 415, 623, 835}.
  • ๐Ÿ’ป Le lingue: C++ and Python Le implementazioni utilizzano l'ordinamento per conteggio come passaggio interno stabile.
  • ๐Ÿ“Š Complessitร : La complessitร  temporale รจ O(d*(n + b)) e la complessitร  spaziale รจ O(n + b), dove n รจ la dimensione dell'array, b รจ la base e d รจ il numero di cifre.
  • ๐Ÿญ applicazioni: Tra le applicazioni piรน comuni si annoverano la costruzione di array di suffissi con l'algoritmo DC3, la ricerca di posizioni in ampi intervalli di valori e l'ordinamento basato su chiavi su macchine ad accesso casuale.

Algoritmo di ordinamento radicale nella struttura dei dati

Cos'รจ l'algoritmo Radix Sort?

Radix Sort รจ un algoritmo di ordinamento non comparativo. Funziona raggruppandoping le singole cifre degli elementi da ordinare. Viene quindi utilizzata una tecnica di ordinamento stabile per organizzare gli elementi in base alla loro base. Si tratta di un algoritmo di ordinamento lineare.

Il processo di ordinamento coinvolge le seguenti proprietร :

  • Si individua l'elemento massimo e si calcola il numero di cifre di tale elemento. Questo fornisce il numero di iterazioni eseguite dal processo di ordinamento.
  • Grouping le singole cifre degli elementi nella stessa posizione significativa in ogni iterazione.
  • Il gruppoping Il processo inizia dalla cifra meno significativa e termina con la cifra piรน significativa.
  • Ordinamento degli elementi in base alle cifre in quella posizione significativa.
  • Mantiene l'ordine relativo degli elementi che hanno lo stesso valore di chiave. Questa proprietร  dell'ordinamento Radix lo rende un algoritmo di ordinamento stabile.

L'iterazione finale restituisce un elenco completamente ordinato.

Funzionamento dell'algoritmo Radix Sort

Funzionamento dell'algoritmo Radix Sort

Elenco di numeri interi da ordinare

Ordiniamo l'elenco di numeri interi nella figura precedente in ordine crescente utilizzando l'algoritmo Radix Sort.

Ecco i passaggi per eseguire il processo di ordinamento Radix:

Passo 1) Individua l'elemento massimo nella lista. In questo caso รจ 835.

Passo 2) Conta le sue cifre. 835 ha 3 cifre, quindi il numero di iterazioni รจ 3.

Passo 3) Determina la base. Poichรฉ si tratta di un numero decimale, la base รจ 10.

Passo 4) Avvia la prima iterazione.

a) Prima iterazione

Funzionamento dell'algoritmo Radix Sort: ordinamento in base all'ultima cifra

Ordinamento in base all'ultima cifra

Nella prima iterazione, consideriamo il valore posizionale unitario di ciascun elemento.

Passo 1) Si applica il modulo 10 al numero intero per ottenere la cifra delle unitร . Ad esempio, 623 mod 10 dร  3 e 248 mod 10 dร  8.

Passo 2) Utilizza l'ordinamento per conteggio o un altro algoritmo di ordinamento stabile per organizzare i numeri interi in base alla loro cifra meno significativa. Come si puรฒ vedere nella figura, 248 rientra nell'ottavo gruppo, 623 nel terzo gruppo e cosรฌ via.

Dopo la prima iterazione, l'elenco ora appare cosรฌ.

Elenco dopo la prima iterazione

Elenco dopo la prima iterazione

L'elenco non รจ ancora ordinato e richiede ulteriori iterazioni.

b) Seconda iterazione

Ordinamento in base alle cifre delle decine

Ordinamento in base alle cifre delle decine

In questa iterazione, consideriamo la cifra delle decine per il processo di ordinamento.

Passo 1) Dividi i numeri interi per 10. Ad esempio, 248 diviso 10 dร  24.

Passo 2) Applica il modulo 10 al risultato del passaggio 1. 24 mod 10 dร  4.

Passo 3) Ripeti il โ€‹โ€‹passaggio 2 dell'iterazione precedente.

Dopo la seconda iterazione, l'elenco ora si presenta cosรฌ:

Elenco dopo la seconda iterazione

Elenco dopo la seconda iterazione

L'elenco non รจ ancora completamente ordinato, in quanto non รจ ancora in ordine crescente.

c) Terza iterazione

Ordinamento in base alle cifre delle centinaia

Ordinamento in base alle cifre delle centinaia

Per l'ultima iterazione, vogliamo ottenere la cifra piรน significativa. In questo caso, si tratta della cifra delle centinaia per ciascuno degli interi presenti nell'elenco.

Passo 1) Dividi i numeri interi per 100. Ad esempio, 415 diviso 100 dร  4.

Passo 2) Applica il modulo 10 al risultato del passaggio 1. 4 mod 10 dร  4.

Passo 3) Ripeti il โ€‹โ€‹passaggio 3 dell'iterazione precedente.

Elenco dopo la terza iterazione

Elenco dopo la terza iterazione

L'elenco รจ ora ordinato in ordine crescente. L'ultima iterazione รจ stata completata e il processo di ordinamento รจ terminato.

Pseudocodice dell'algoritmo Radix Sort

Ecco lo pseudocodice dell'algoritmo di ordinamento Radix:

radixSortAlgo(arr as an array)
    Find the largest element in arr
    maximum = the element in arr that is the largest
    Find the number of digits in maximum
    k = the number of digits in maximum
    Create buckets of size 0-9 k times
    for j -> 0 to k
        Acquire the jth place of each element in arr. Here j = 0 represents the least significant digit.
        Use a stable sorting algorithm like counting sort to sort the elements in arr according to the digits in the jth place
    arr = sorted elements

C++ Programma per implementare l'ordinamento digitale

#include <iostream>
using namespace std;
// Function to get the largest element in an array
int getMaximum(int arr[], int n) {
    int maximum = arr[0];
    for (int i = 1; i < n; i++) {
        if (maximum < arr[i]) maximum = arr[i];
    }
    return maximum;
}
// We are using counting sort to sort the elements digit by digit
void countingSortAlgo(int arr[], int size, int position) {
    const int limit = 10;
    int result[size];
    int count[limit] = {0};
    // Calculating the count of each integer
    for (int j = 0; j < size; j++) count[(arr[j] / position) % 10]++;
    // Calculating the cumulative count
    for (int j = 1; j < limit; j++) {
        count[j] += count[j - 1];
    }
    // Sort the integers
    for (int j = size - 1; j >= 0; j--) {
        result[count[(arr[j] / position) % 10] - 1] = arr[j];
        count[(arr[j] / position) % 10]--;
    }
    for (int i = 0; i < size; i++) arr[i] = result[i];
}
// The radixSort algorithm
void radixSortAlgo(int arr[], int size) {
    // Get the largest element in the array
    int maximum = getMaximum(arr, size);
    for (int position = 1; maximum / position > 0; position *= 10)
        countingSortAlgo(arr, size, position);
}
// Printing final result
void printResult(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;
}
int main() {
    int arr[] = {162, 623, 835, 415, 248};
    int size = sizeof(arr) / sizeof(arr[0]);
    radixSortAlgo(arr, size);
    printResult(arr, size);
}

Produzione:

162 248 415 623 835

Python Programma per l'algoritmo di ordinamento radicale

# Radix Sort in Python
def countingSortAlgo(arr, position):
    n = len(arr)
    result = [0] * n
    count = [0] * 10
    # Calculating the count of elements in the array arr
    for j in range(0, n):
        element = arr[j] // position
        count[element % 10] += 1
    # Calculating the cumulative count
    for j in range(1, 10):
        count[j] += count[j - 1]
    # Sorting the elements
    i = n - 1
    while i >= 0:
        element = arr[i] // position
        result[count[element % 10] - 1] = arr[i]
        count[element % 10] -= 1
        i -= 1
    for j in range(0, n):
        arr[j] = result[j]

def radixSortAlgo(arr):
    # Acquiring the largest element in the array
    maximum = max(arr)
    # Using counting sort to sort digit by digit
    position = 1
    while maximum // position > 0:
        countingSortAlgo(arr, position)
        position *= 10

data = [162, 623, 835, 415, 248]
radixSortAlgo(data)
print(data)

Produzione:

[162, 248, 415, 623, 835]

Analisi della complessitร  dell'ordinamento Radix

Esistono due tipi di complessitร  da considerare: la complessitร  spaziale e la complessitร  temporale.

  • Complessitร  spaziale: O(n + b) dove n รจ la dimensione dell'array e b รจ la base considerata.
  • Complessitร  temporale: O(d * (n + b)) dove d รจ il numero di cifre dell'elemento piรน grande nell'array.

Complessitร  spaziale dell'ordinamento radicale

Due caratteristiche su cui concentrarsi per la complessitร  spaziale:

  • Numero di elementi nell'array, n.
  • La base utilizzata per rappresentare gli elementi, b.

A volte questa base puรฒ essere maggiore della dimensione dell'array. La complessitร  complessiva รจ quindi O(n + b).

Le seguenti proprietร  degli elementi presenti nell'elenco possono rendere l'algoritmo Radix Sort inefficiente in termini di spazio:

  • Elementi con un gran numero di cifre.
  • La base degli elementi รจ grande, come i numeri a 64 bit.

Complessitร  temporale dell'ordinamento digitale

Utilizzando l'ordinamento per conteggio come sottoprogramma, ogni iterazione richiede O(n + b) tempo. Se esistono d iterazioni, il tempo di esecuzione totale diventa O(d * (n + b))Qui, โ€œOโ€ denota la funzione di complessitร .

Linearitร  dell'ordinamento radicale

L'ordinamento Radix รจ lineare quando:

  • d รจ costante, dove d รจ il numero di cifre dell'elemento piรน grande.
  • b non รจ significativamente piรน grande di n.

Confronto tra l'ordinamento Radix e altri algoritmi di ordinamento Algorithms

La complessitร  dell'algoritmo Radix Sort dipende dalla dimensione del numero. I casi migliori e average-case hanno entrambi una complessitร  O(d * (n + b)). Le prestazioni variano a seconda dell'algoritmo di ordinamento interno: il counting sort รจ lo standard, ma qualsiasi algoritmo di ordinamento stabile funziona.

Applicazioni dell'algoritmo Radix Sort

Le principali applicazioni dell'algoritmo Radix Sort sono:

  • L'ordinamento Radix puรฒ essere utilizzato come algoritmo di localizzazione quando sono coinvolti ampi intervalli di valori.
  • Viene utilizzato per costruire un array di suffissi nell'algoritmo DC3.
  • Viene utilizzato nelle macchine ad accesso casuale sequenziale, dove i record sono indicizzati da identificatori a larghezza fissa.

DOMANDE FREQUENTI

Radix Sort accelera la preelaborazione dei dati AI e l'ordinamento di chiavi intere ottimizzato per GPU. Anche i database vettoriali e le pipeline di embedding utilizzano il partizionamento in stile radix per i bucket dei vicini piรน prossimi.

Sรฌ. GitHub Copilot e GPT possono generare Radix Sort in Python, C++, Javao Rust, comprese le varianti LSD e MSD e le versioni che ordinano stringhe o chiavi binarie a larghezza fissa.

L'algoritmo Radix Sort รจ piรน lento di Quick Sort su array di interi di grandi dimensioni con un numero ridotto di cifre perchรฉ evita i confronti. Su dati generici o valori in virgola mobile รจ spesso piรน lento di Quick Sort.

L'algoritmo Radix Sort รจ stabile quando l'algoritmo di ordinamento interno รจ stabile, come ad esempio il counting sort. Non รจ un algoritmo in-place, poichรฉ richiede array di bucket di dimensione O(n + b) oltre all'array di input.

L'algoritmo LSD Radix Sort elabora le cifre dalla meno significativa alla piรน significativa ed รจ adatto a numeri interi a larghezza fissa. L'algoritmo MSD Radix Sort parte dalla cifra piรน significativa ed รจ adatto a stringhe di lunghezza variabile.

L'algoritmo Radix Sort standard presuppone numeri interi non negativi. I valori negativi vengono gestiti spostandoli del valore minimo dell'array, oppure ordinando i valori positivi e negativi in โ€‹โ€‹passaggi separati.

L'algoritmo Radix Sort รจ alla base della costruzione di array di suffissi, delle tabelle di routing IP, degli indici di database, dei kernel di ordinamento GPU, del routing della posta per codice postale e dell'ordinamento lessicografico delle stringhe nei compilatori.

L'ordinamento per conteggio รจ stabile e viene eseguito in tempo O(n + b), mantieniping Il costo totale dell'ordinamento Radix รจ lineare. La sua stabilitร  preserva l'ordine delle cifre uguali, requisito fondamentale della strategia multi-passaggio.

Riassumi questo post con: