Αλγόριθμος ταξινόμησης ριζών στη δομή δεδομένων

⚡ Έξυπνη Σύνοψη

Η ταξινόμηση Radix είναι ένας μη συγκριτικός γραμμικός αλγόριθμος ταξινόμησης που ομαδοποιεί ακέραιους αριθμούς κατά θέση ψηφίου, χρησιμοποιώντας μια σταθερή υπορουτίνα όπως η ταξινόμηση με μέτρηση. Ταξινομεί αριθμούς, συμβολοσειρές και κλειδιά σταθερού πλάτους ταχύτερα από τις ταξινομήσεις που βασίζονται σε σύγκριση για πολλές εισόδους.

  • 🎯 Βασική ιδέα: Η ταξινόμηση Radix επεξεργάζεται κάθε ψηφίο κάθε στοιχείου από το λιγότερο σημαντικό στο πιο σημαντικό, κατανέμοντας τις τιμές σε κάδους και επανασυναρμολογώντας τον πίνακα σε κάθε πέρασμα.
  • ⚙️ Σταθερή Υπορουτίνα: Μια σταθερή εσωτερική ταξινόμηση, όπως η ταξινόμηση με μέτρηση, διατηρεί την προηγούμενη σειρά των ίσων ψηφίων, κάτι που είναι απαραίτητο για την πλήρη ταξινόμηση του τελικού αποτελέσματος.
  • 🧭 Παράδειγμα εργασίας: Τρεις επαναλήψεις στον πίνακα {162, 623, 835, 415, 248} σε στήλες μονάδων, δεκάδων και εκατοντάδων παράγουν την ταξινομημένη έξοδο {162, 248, 415, 623, 835}.
  • 💻 γλώσσες: C++ και Python Οι υλοποιήσεις χρησιμοποιούν την αριθμητική ταξινόμηση ως σταθερό εσωτερικό πέρασμα.
  • 📊 Περίπλοκο: Η χρονική πολυπλοκότητα είναι O(d*(n + b)) και η χωρική πολυπλοκότητα είναι O(n + b), όπου n είναι το μέγεθος του πίνακα, b είναι η βάση και d είναι ο αριθμός των ψηφίων.
  • 🏭 εφαρμογές: Η κατασκευή πινάκων επιθημάτων με τον αλγόριθμο DC3, η εύρεση τοποθεσίας σε μεγάλα εύρη τιμών και η ταξινόμηση βάσει κλειδιού σε μηχανές τυχαίας πρόσβασης είναι συνήθεις χρήσεις.

Αλγόριθμος ταξινόμησης ριζών στη δομή δεδομένων

Τι είναι ο αλγόριθμος ταξινόμησης Radix;

Το Radix Sort είναι ένας μη συγκριτικός αλγόριθμος ταξινόμησης. Λειτουργεί κατά ομάδα.ping τα μεμονωμένα ψηφία των στοιχείων που πρόκειται να ταξινομηθούν. Στη συνέχεια, χρησιμοποιείται μια τεχνική σταθερής ταξινόμησης για την οργάνωση των στοιχείων με βάση την ακτίνα τους. Πρόκειται για έναν γραμμικό αλγόριθμο ταξινόμησης.

Η διαδικασία ταξινόμησης περιλαμβάνει τις ακόλουθες ιδιότητες:

  • Εύρεση του μέγιστου στοιχείου και λήψη του αριθμού των ψηφίων αυτού του στοιχείου. Αυτό δίνει τον αριθμό των επαναλήψεων που εκτελεί η διαδικασία ταξινόμησης.
  • Grouping τα μεμονωμένα ψηφία των στοιχείων στην ίδια σημαντική θέση σε κάθε επανάληψη.
  • Η ομάδαping Η διαδικασία ξεκινά από το λιγότερο σημαντικό ψηφίο και τελειώνει στο πιο σημαντικό ψηφίο.
  • Ταξινόμηση των στοιχείων με βάση τα ψηφία σε αυτήν τη σημαντική θέση.
  • Διατήρηση της σχετικής σειράς των στοιχείων που έχουν την ίδια τιμή-κλειδί. Αυτή η ιδιότητα της Radix Sort την καθιστά σταθερή.

Η τελική επανάληψη επιστρέφει μια πλήρως ταξινομημένη λίστα.

Εργασία Αλγόριθμου Ταξινόμησης Radix

Εργασία Αλγόριθμου Ταξινόμησης Radix

Λίστα ακεραίων προς ταξινόμηση

Ας ταξινομήσουμε τη λίστα των ακεραίων στο παραπάνω σχήμα σε αύξουσα σειρά χρησιμοποιώντας την Radix Sort.

Ακολουθούν τα βήματα για την εκτέλεση της διαδικασίας Radix Sort:

Βήμα 1) Προσδιορίστε το μέγιστο στοιχείο στη λίστα. Εδώ είναι 835.

Βήμα 2) Μετρήστε τα ψηφία του. Το 835 έχει 3 ψηφία, άρα ο αριθμός των επαναλήψεων είναι 3.

Βήμα 3) Προσδιορίστε τη βάση. Εφόσον αυτή είναι δεκαδική, η βάση είναι το 10.

Βήμα 4) Ξεκινήστε την πρώτη επανάληψη.

α) Πρώτη επανάληψη

Λειτουργία του αλγορίθμου ταξινόμησης Radix - ταξινόμηση κατά τελευταίο ψηφίο

Ταξινόμηση κατά το τελευταίο ψηφίο

Στην πρώτη επανάληψη, εξετάζουμε τη μοναδιαία θέση αξίας κάθε στοιχείου.

Βήμα 1) Τροποποιήστε τον ακέραιο αριθμό κατά 10 για να λάβετε τη θέση των στοιχείων. Για παράδειγμα, 623 mod 10 δίνει 3 και 248 mod 10 δίνει 8.

Βήμα 2) Χρησιμοποιήστε την ταξινόμηση με μέτρηση ή κάποια άλλη σταθερή ταξινόμηση για να οργανώσετε τους ακέραιους αριθμούς σύμφωνα με το λιγότερο σημαντικό ψηφίο τους. Από το σχήμα, το 248 εμπίπτει στην 8η κατηγορία, το 623 εμπίπτει στην 3η κατηγορία και ούτω καθεξής.

Μετά την πρώτη επανάληψη, η λίστα μοιάζει τώρα με αυτό.

Λίστα μετά την πρώτη επανάληψη

Λίστα μετά την πρώτη επανάληψη

Η λίστα δεν έχει ακόμη ταξινομηθεί και απαιτεί περισσότερες επαναλήψεις.

β) Δεύτερη επανάληψη

Ταξινόμηση βάσει ψηφίων σε θέση δεκάδων

Ταξινόμηση βάσει ψηφίων σε θέση δεκάδων

Σε αυτήν την επανάληψη, λαμβάνουμε υπόψη το ψηφίο στη θέση των δεκάδων για τη διαδικασία ταξινόμησης.

Βήμα 1) Διαιρέστε τους ακέραιους αριθμούς με το 10. Για παράδειγμα, το 248 διαιρούμενο με το 10 δίνει 24.

Βήμα 2) Τροποποιήστε την έξοδο του Βήματος 1 κατά 10. Το 24 mod 10 δίνει 4.

Βήμα 3) Ακολουθήστε το Βήμα 2 από την προηγούμενη επανάληψη.

Μετά τη δεύτερη επανάληψη, η λίστα έχει πλέον ως εξής:

Λίστα μετά τη δεύτερη επανάληψη

Λίστα μετά τη δεύτερη επανάληψη

Η λίστα δεν έχει ακόμη ταξινομηθεί πλήρως, καθώς δεν είναι σε αύξουσα σειρά.

γ) Τρίτη επανάληψη

Ταξινόμηση με βάση τα ψηφία σε εκατοστά

Ταξινόμηση με βάση τα ψηφία σε εκατοστά

Για την τελική επανάληψη, θέλουμε να λάβουμε το πιο σημαντικό ψηφίο. Σε αυτήν την περίπτωση, είναι η θέση των εκατοντάδων για κάθε έναν από τους ακέραιους αριθμούς στη λίστα.

Βήμα 1) Διαιρέστε τους ακέραιους αριθμούς με το 100. Για παράδειγμα, το 415 διαιρούμενο με το 100 δίνει 4.

Βήμα 2) Τροποποιήστε το αποτέλεσμα από το Βήμα 1 κατά 10. Η τροποποίηση 4 στο 10 δίνει 4.

Βήμα 3) Ακολουθήστε το Βήμα 3 από την προηγούμενη επανάληψη.

Λίστα μετά την τρίτη επανάληψη

Λίστα μετά την τρίτη επανάληψη

Η λίστα είναι πλέον ταξινομημένη σε αύξουσα σειρά. Η τελική επανάληψη έχει ολοκληρωθεί και η διαδικασία ταξινόμησης έχει ολοκληρωθεί.

Ψευδοκώδικας αλγόριθμου ταξινόμησης ριζών

Εδώ είναι ο ψευδοκώδικας για τον αλγόριθμο ταξινόμησης 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++ Πρόγραμμα για την εφαρμογή Radix Sort

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

Παραγωγή:

162 248 415 623 835

Python Πρόγραμμα για τον αλγόριθμο ταξινόμησης ριζών

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

Παραγωγή:

[162, 248, 415, 623, 835]

Ανάλυση Πολυπλοκότητας της Ταξινόμησης Radix

Υπάρχουν δύο τύποι πολυπλοκότητας που πρέπει να ληφθούν υπόψη: η χωρική πολυπλοκότητα και η χρονική πολυπλοκότητα.

  • Πολυπλοκότητα χώρου: O(n + b) όπου n είναι το μέγεθος του πίνακα και b είναι η βάση που εξετάζεται.
  • Χρονική πολυπλοκότητα: O(d * (n + b)) όπου d είναι ο αριθμός των ψηφίων του μεγαλύτερου στοιχείου στον πίνακα.

Διαστημική πολυπλοκότητα του Radix Sort

Δύο χαρακτηριστικά στα οποία πρέπει να εστιάσετε για την πολυπλοκότητα του χώρου:

  • Αριθμός στοιχείων στον πίνακα, n.
  • Η βάση που χρησιμοποιείται για την αναπαράσταση των στοιχείων, b.

Μερικές φορές αυτή η βάση μπορεί να είναι μεγαλύτερη από το μέγεθος του πίνακα. Η συνολική πολυπλοκότητα είναι επομένως O(n + b).

Οι ακόλουθες ιδιότητες των στοιχείων στη λίστα μπορούν να καταστήσουν τον χώρο Radix Sort αναποτελεσματικό:

  • Στοιχεία με μεγάλο αριθμό ψηφίων.
  • Η βάση των στοιχείων είναι μεγάλη, όπως αριθμοί 64 bit.

Χρονική πολυπλοκότητα ταξινόμησης ριζών

Χρησιμοποιώντας την ταξινόμηση με μέτρηση ως υπορουτίνα, κάθε επανάληψη διαρκεί Ο(n + b) χρόνος. Εάν υπάρχουν d επαναλήψεις, γίνεται ο συνολικός χρόνος λειτουργίας Ο(δ * (ν + β))Εδώ, το «O» υποδηλώνει τη συνάρτηση πολυπλοκότητας.

Γραμμικότητα Ταξινόμησης Radix

Η ταξινόμηση Radix είναι γραμμική όταν:

  • d είναι σταθερό, όπου d είναι ο αριθμός των ψηφίων του μεγαλύτερου στοιχείου.
  • b δεν είναι σημαντικά μεγαλύτερο από n.

Σύγκριση της ταξινόμησης Radix με άλλες μεθόδους ταξινόμησης Algorithms

Η πολυπλοκότητα της Radix Sort εξαρτάται από το μέγεθος του αριθμού. Η καλύτερη περίπτωση και η μέση περίπτωση είναι και οι δύο O(d * (n + b)). Η απόδοση ποικίλλει ανάλογα με την εσωτερική ταξινόμηση — η ταξινόμηση με μέτρηση είναι τυπική, αλλά οποιαδήποτε σταθερή ταξινόμηση λειτουργεί.

Εφαρμογές Αλγόριθμου Ταξινόμησης Radix

Σημαντικές εφαρμογές του Radix Sort είναι:

  • Η ταξινόμηση Radix μπορεί να χρησιμοποιηθεί ως αλγόριθμος εύρεσης τοποθεσίας όπου εμπλέκονται μεγάλα εύρη τιμών.
  • Χρησιμοποιείται για την κατασκευή ενός πίνακα επιθημάτων στον αλγόριθμο DC3.
  • Χρησιμοποιείται σε μηχανήματα διαδοχικής, τυχαίας πρόσβασης όπου οι εγγραφές κλειδώνονται από αναγνωριστικά σταθερού πλάτους.

Συχνές Ερωτήσεις

Το Radix Sort επιταχύνει την προεπεξεργασία δεδομένων με τεχνητή νοημοσύνη και την φιλική προς την GPU ταξινόμηση ακεραίων κλειδιών. Οι διανυσματικές βάσεις δεδομένων και οι αγωγοί ενσωμάτωσης χρησιμοποιούν επίσης διαμέριση τύπου radix για τους κάδους πλησιέστερων γειτόνων.

Ναι. Το GitHub Copilot και το GPT μπορούν να δημιουργήσουν Radix Sort σε Python, C++, Java, ή Rust, συμπεριλαμβανομένων παραλλαγών και εκδόσεων LSD και MSD που ταξινομούν συμβολοσειρές ή δυαδικά κλειδιά σταθερού πλάτους.

Η ταξινόμηση Radix είναι καλύτερη από την γρήγορη ταξινόμηση σε μεγάλους ακέραιους πίνακες με μικρό αριθμό ψηφίων, επειδή αποφεύγει τις συγκρίσεις. Σε γενικά δεδομένα ή τιμές κινητής υποδιαστολής είναι συχνά πιο αργή από την γρήγορη ταξινόμηση.

Η ταξινόμηση Radix είναι σταθερή όταν η εσωτερική ταξινόμηση είναι σταθερή, όπως η ταξινόμηση με μέτρηση. Δεν είναι in-place, επειδή απαιτούνται πίνακες bucket μεγέθους O(n + b) επιπλέον του πίνακα εισόδου.

Η ταξινόμηση LSD Radix επεξεργάζεται ψηφία από το λιγότερο σημαντικό στο πιο σημαντικό και ταιριάζει σε ακέραιους σταθερού πλάτους. Η ταξινόμηση MSD Radix ξεκινά από το πιο σημαντικό ψηφίο και ταιριάζει σε συμβολοσειρές μεταβλητού μήκους.

Η τυπική ταξινόμηση Radix υποθέτει μη αρνητικούς ακέραιους αριθμούς. Οι αρνητικοί αριθμοί αντιμετωπίζονται με μετατόπιση τιμών από το ελάχιστο του πίνακα ή με ταξινόμηση θετικών και αρνητικών αριθμών σε ξεχωριστά περάσματα.

Το Radix Sort εξουσιοδοτεί την κατασκευή πινάκων επιθημάτων, τους πίνακες δρομολόγησης IP, τα ευρετήρια βάσεων δεδομένων, την ταξινόμηση πυρήνων GPU, τη δρομολόγηση αλληλογραφίας κατά ταχυδρομικό κώδικα και τη λεξικογραφική ταξινόμηση συμβολοσειρών σε μεταγλωττιστές.

Η ταξινόμηση με μέτρηση είναι σταθερή και εκτελείται σε χρόνο O(n + b), διατηρώνταςping το συνολικό κόστος Radix Sort γραμμικό. Η σταθερότητά του διατηρεί τη σειρά των ίσων ψηφίων, την οποία απαιτεί η στρατηγική πολλαπλών περασμάτων.

Συνοψίστε αυτήν την ανάρτηση με: