Μέθοδος 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 για περαιτέρω κέρδη απόδοσης, αν και αυτό προσθέτει ένα διαφορετικό επίπεδο πολυπλοκότητας.
Πνευματικά δικαιώματα © Γνώση Υπολογιστών Όλα τα δικαιώματα κατοχυρωμένα