Vitajte na [www.pocitac.win] Pripojiť k domovskej stránke Obľúbené stránky
Metóda 1:Používanie zoznamu a operátora modulu
Táto metóda je najpriamejšia a všeobecne najúčinnejšia. Používa operátor Modulo na zabalenie indexov poľa.
`` `Python
triedny CircularArray:
def __init __ (ja, kapacita):
self.kapacity =kapacita
self.array =[none] * kapacita
self.head =0
self.size =0
def is_empty (self):
návrat self.size ==0
def is_full (self):
návrat self.size ==self.capacity
def enqueue (ja, položka):
ak self.is_full ():
Zvýšenie indexError („Kruhové pole je plné“)
self.array [(self.head + self.size) % self.capacity] =položka
self.size +=1
Def Dequeue (self):
ak self.is_empty ():
Zvýšenie indexError („kruhové pole je prázdne“)
item =self.array [self.head]
self.head =(self.head + 1) % self.kapacity
self.size -=1
vrátenie
def peek (ja):
ak self.is_empty ():
Zvýšenie indexError („kruhové pole je prázdne“)
návrat self.array [self.head]
def __len __ (self):
Vráťte sa
def __str __ (self):
návrat Str (self.array)
#Príklad využitia
Circular_array =CircularArray (5)
Circular_array.enqueue (10)
Circular_array.enqueue (20)
Circular_array.enqueue (30)
Print (Circular_array) # výstup:[10, 20, 30, žiadny, žiadny]
tlač (Circular_array.dequeue ()) # výstup:10
Print (Circular_array) # výstup:[Žiadne, 20, 30, žiadne, žiadne, žiadne]
Circular_array.enqueue (40)
Circular_array.enqueue (50)
tlač (Circular_array) # výstup:[žiadne, 20, 30, 40, 50]
tlač (Circular_array.is_full ()) # výstup:true
`` `
Metóda 2:Použitie `kolekcie.deque` (pre jednoduchšiu implementáciu, ale potenciálne menej efektívna pre veľké polia)
Python's `Collections.deque` poskytuje dvojitý front, ktorý sa dá použiť na napodobnenie kruhového poľa. Je jednoduchšie implementovať, ale môže byť menej efektívne pre veľmi veľké polia v porovnaní s prístupom založeným na priamom zozname v dôsledku režijných nákladov.
`` `Python
Z zbierok import deque
trieda CircularrayDeque:
def __init __ (ja, kapacita):
self.kapacity =kapacita
self.array =deque (maxlen =kapacita)
def is_empty (self):
návrat Len (self.array) ==0
def is_full (self):
návrat Len (self.array) ==self.capacity
def enqueue (ja, položka):
ak self.is_full ():
Zvýšenie indexError („Kruhové pole je plné“)
self.array.append (položka)
Def Dequeue (self):
ak self.is_empty ():
Zvýšenie indexError („kruhové pole je prázdne“)
návrat self.array.popleft ()
def peek (ja):
ak self.is_empty ():
Zvýšenie indexError („kruhové pole je prázdne“)
návrat self.array [0]
def __len __ (self):
návrat Len (self.array)
def __str __ (self):
return Str (zoznam (self.array))
#Example Sunage (rovnaké ako vyššie, stačí nahradiť CircularArray za CircularArrayDeque)
`` `
Ktorý spôsob zvoliť?
Vo väčšine prípadov metóda 1 (pomocou zoznamu a operátora modulu) sa odporúča kvôli jeho všeobecne lepším výkonom, najmä pre väčšie polia. `Collections.Deque` je dobrá voľba, ak je jednoduchosť a čitateľnosť uprednostňované pred výkonom RAW a neočakáva sa, že veľkosť poľa bude mimoriadne veľká. Ak pracujete so skutočne masívnymi poliami, môžete zvážiť použitie numpy polí pre ďalšie zvýšenie výkonu, aj keď to dodáva inú úroveň zložitosti.