Vitajte na [www.pocitac.win] Pripojiť k domovskej stránke Obľúbené stránky

Domáce Hardware Siete Programovanie Softvér Otázka Systémy

Ako môžem efektívne implementovať kruhové pole v Pythone?

Python nemá zabudovanú štruktúru dát kruhového poľa. Môžete však efektívne implementovať jeden pomocou štandardného zoznamu pythonu a operátora modulu (`%`). Tu sú dva prístupy:

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.

Najnovšie články

Copyright © počítačové znalosti Všetky práva vyhradené