Προγραμματισμός

Γνώση Υπολογιστών >> Προγραμματισμός >  >> Python Προγραμματισμός

Πώς μπορώ να εφαρμόσω αποτελεσματικά έναν κυκλικό πίνακα στο Python;

Η Python δεν διαθέτει ενσωματωμένη δομή δεδομένων κυκλικής συστοιχίας. Ωστόσο, μπορείτε να εφαρμόσετε αποτελεσματικά ένα χρησιμοποιώντας μια τυπική λίστα Python και τον χειριστή Modulo (`%`). Ακολουθούν δύο προσεγγίσεις:

Μέθοδος 1:Χρησιμοποιώντας μια λίστα και έναν χειριστή Modulo

Αυτή η μέθοδος είναι η πιο απλή και γενικά η πιο αποτελεσματική. Χρησιμοποιεί τον χειριστή Modulo για να τυλίξει τους δείκτες της σειράς.

`` `Python

Class Circulararray:

def __init __ (εαυτός, χωρητικότητα):

self.capacity =χωρητικότητα

self.array =[καμία] * χωρητικότητα

self.head =0

self.size =0

def is_empty (self):

επιστροφή self.size ==0

def is_full (self):

επιστροφή self.size ==self.capacity

def enqueue (εαυτός, αντικείμενο):

αν self.is_full ():

raise indexError ("Circular Array είναι γεμάτη")

self.array [(self.head + self.size) % self.capacity] =στοιχείο

self.size +=1

def dequeue (εαυτός):

αν self.is_empty ():

raise indexError ("Η κυκλική συστοιχία είναι άδειος")

στοιχείο =self.array [self.head]

self.head =(self.head + 1) % self.capacity

self.size -=1

αντικείμενο επιστροφής

def peek (εαυτός):

αν self.is_empty ():

raise indexError ("Η κυκλική συστοιχία είναι άδειος")

Επιστρέψτε το Self.Array [Self.head]

def __len __ (εαυτός):

Επιστρέψτε τον εαυτό σας.

def __str __ (εαυτός):

Επιστροφή STR (Self.Array)

#Παράδειγμα χρήσης

Circular_Array =CircularArray (5)

Circular_Array.enqueue (10)

Circular_Array.enqueue (20)

Circular_Array.enqueue (30)

Εκτύπωση (Circular_Array) # Έξοδος:[10, 20, 30, Κανένα, Κανένα]

εκτύπωση (Circular_Array.Dequeue ()) # έξοδος:10

Εκτύπωση (Circular_Array) # Έξοδος:[Κανένα, 20, 30, Κανένα, Κανένα]

Circular_Array.enqueue (40)

Circular_Array.enqueue (50)

Εκτύπωση (Circular_Array) # Έξοδος:[Κανένα, 20, 30, 40, 50]

εκτύπωση (Circular_Array.is_full ()) # έξοδος:True

`` `

Μέθοδος 2:Χρήση `Collections.deque` (για απλούστερη εφαρμογή, αλλά δυνητικά λιγότερο αποτελεσματική για μεγάλες συστοιχίες)

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

`` `Python

Από τις συλλογές εισαγωγή deque

Κατηγορία CircularArraydeque:

def __init __ (εαυτός, χωρητικότητα):

self.capacity =χωρητικότητα

self.array =deque (maxlen =χωρητικότητα)

def is_empty (self):

επιστροφή len (self.array) ==0

def is_full (self):

Επιστρέψτε το len (self.array) ==self.capacity

def enqueue (εαυτός, αντικείμενο):

αν self.is_full ():

raise indexError ("Circular Array είναι γεμάτη")

self.array.append (στοιχείο)

def dequeue (εαυτός):

αν self.is_empty ():

raise indexError ("Η κυκλική συστοιχία είναι άδειος")

Επιστρέψτε το self.array.popleft ()

def peek (εαυτός):

αν self.is_empty ():

raise indexError ("Η κυκλική συστοιχία είναι άδειος")

Επιστρέψτε το self.array [0]

def __len __ (εαυτός):

Επιστροφή Len (self.array)

def __str __ (εαυτός):

Επιστρέψτε το STR (LIST (self.array))

#Παράδειγμα χρήσης (ίδιο όπως παραπάνω, απλώς αντικαταστήστε το CircularArray με το CircularArraydeque)

`` `

Ποια μέθοδος θα επιλέξετε;

Για τις περισσότερες περιπτώσεις, η μέθοδος 1 (χρησιμοποιώντας μια λίστα και έναν χειριστή Modulo) συνιστάται λόγω της γενικά καλύτερης απόδοσής του, ειδικά για μεγαλύτερες συστοιχίες. Το `Collections.deque` είναι μια καλή επιλογή εάν η απλότητα και η αναγνωσιμότητα έχουν προτεραιότητα σε σχέση με τις ακατέργαστες επιδόσεις και το μέγεθος του πίνακα δεν αναμένεται να είναι εξαιρετικά μεγάλο. Εάν εργάζεστε με πραγματικά τεράστιες συστοιχίες, μπορείτε να εξετάσετε τη χρήση συστοιχιών Numpy για περαιτέρω κέρδη απόδοσης, αν και αυτό προσθέτει ένα διαφορετικό επίπεδο πολυπλοκότητας.

Συναφής σύστασή

Πνευματικά δικαιώματα © Γνώση Υπολογιστών Όλα τα δικαιώματα κατοχυρωμένα