Junior
რა იცით მონაცემთა სტრუქტურაზე 'სია'?
sobes.tech AI
პასუხი AI-სგან
სია (Queue) — ეს მონაცემთა სიაა, რომელიც მუშაობს FIFO (First-In, First-Out) პრინციპით: პირველი შეყვანილი ელემენტი პირველი გამოდის.
ძირითადი ოპერაციები:
- put/enqueue: ელემენტის დამატება ბოლო ადგილზე.
- get/dequeue: ელემენტის ამოღება და დაბრუნება დასაწყისიდან.
- peek/front: ელემენტის ნახვა დასაწყისში — ამოღების გარეშე.
- is_empty: სიის ცარიელობა შემოწმება.
- size: მიმდინარე ელემენტების რაოდენობა.
Python-ში რეალიზაციები:
- list: მარტივი, მაგრამ არაეფექტური ხშირი ოპერაციების დროს (
pop(0)სვლით). - collections.deque: ორმხრივი სია, ოპტიმიზირებულია ორივე მხარის დამატებისა და ამოღებისთვის, ჩვეულებრივი სიის მსგავსად გამოიყენება.
- queue.Queue: ნაკადის უსაფრთხო რეალიზაცია, სასარგებლოა ნაკადებს შორის მონაცემთა გაცვლისთვის.
collections.deque გამოყენების მაგალითები:
# სიის ინიციალიზაცია
from collections import deque
q = deque()
# ელემენტების დამატება (enqueue)
q.append('a')
q.append('b')
q.append('c')
# ელემენტების ამოღება და დაბრუნება (dequeue)
პირველი_ელემენტი = q.popleft() # 'a'
მეორე_ელემენტი = q.popleft() # 'b'
# დასაწყისში ელემენტის ნახვა (peek) — პირდაპირი არაა, საჭიროებს იმპორტს ან ცარიელობის შემოწმებას
if q:
peek_element = q[0] # 'c'
# ცარიელობის შემოწმება
ცარიელია = not q
# ზომა
ამჟამინდელი_ზომა = len(q)
queue.Queue გამოყენების მაგალითები:
# ნაკადის უსაფრთხო სიის ინიციალიზაცია
from queue import Queue
q_threaded = Queue()
# ელემენტების დამატება (put)
q_threaded.put('task1')
q_threaded.put('task2')
# ელემენტების ამოღება და დაბრუნება (get) — ბლოკირებადი ოპერაცია
საქმე = q_threaded.get() # 'task1'
# დასრულების შეტყობინება
q_threaded.task_done()
# ცარიელობის შემოწმება
ცარიელია_ნაკადი = q_threaded.empty()
# ზომა
ამჟამინდელი_ზომა = q_threaded.qsize()
გამოყენება:
- დავალებების დაგეგმვა (scheduler)
- FIFO ბუფერები
- გრაფების სვლები (BFS)
- მოთხოვნების დამუშავება (მაგ., ვებ სერვერში)
- ნაკადებს შორის უსაფრთხო ურთიერთქმედება (
queue.Queue-ით).