Thuta Learning
Data Structures & Algorithms
IntermediateProgrammingintermediate

Queue — FIFO ဒေတာဖွဲ့စည်းပုံ

ဒီခန်းပြီးရင် ဘာတတ်သွားမလဲ

  • Queue — FIFO ဒေတာဖွဲ့စည်းပုံ concept ကို နားလည်ရှင်းပြနိုင်ရန်
  • နမူနာ Python code ကို ကိုယ်တိုင် run ပြီး output စစ်နိုင်ရန်
  • Tutorial Platform project နှင့် production scenario တွင် မှန်ကန်စွာအသုံးချနိုင်ရန်

နားလည်ထားရမယ့် အချက်

Queue ဟာ stack ရဲ့ ဆန့်ကျင်ဘက်ယူဆချက်ကို သုံးတယ် — element ဘယ်အစီအစဉ်နဲ့ ရောက်လာလဲ ဒီအစီအစဉ်အတိုင်း ပြန်ထုတ်ရတယ်၊ First In, First Out (FIFO)၊ ဒါကို ဆိုင်ခန်းရှေ့ တန်းစီနေတဲ့ လူတန်းစီနဲ့ တိုက်ရိုက်နှိုင်းယှဉ်နိုင်တယ်။ Python မှာ queue ကို plain `list` နဲ့ implement လုပ်ရင် `append()` က နောက်ဆုံးမှာ O(1) ထည့်နိုင်ပေမယ့်၊ `pop(0)` က ရှေ့ဆုံးကနေ ထုတ်ရာမှာ ကျန်တဲ့ element အားလုံးကို ဘယ်ဘက် တစ်နေရာစီ shift ချရလို့ O(n) ဖြစ်တယ် — queue တစ်ခုအတွက် ဒါက ပြင်းထန်စွာ inefficient ဖြစ်တယ်။ `collections.deque` ကတော့ ဒီကန့်သတ်ချက် မရှိဘူး — doubly linked structure ကနေ `append()` နဲ့ `popleft()` နှစ်ခုစလုံး O(1) ဖြစ်တယ်၊ ဒါကြောင့် queue implement လုပ်ဖို့ Python ရဲ့ standard library ကို သုံးမယ်ဆိုရင် deque က မှန်ကန်တဲ့ ရွေးချယ်မှုပဲဖြစ်တယ်။ Queue ရဲ့ classic use case တွေက task scheduling (job တွေကို ရောက်လာတဲ့ အစီအစဉ်အတိုင်း process လုပ်ချင်တဲ့အခါ) နဲ့ breadth-first traversal (graph/tree တစ်ခုကို level-by-level စူးစမ်းချင်တဲ့အခါ node တွေကို ရှာတွေ့တဲ့ အစီအစဉ်အတိုင်း queue ထဲထည့်ရတယ်) — ဒီနောက်ပိုင်း BFS lesson အတွက် အခြေခံဖြစ်တယ်။

လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်

Tutorial Platform ရဲ့ background job system ဟာ queue ကို သုံးတယ် — lesson အသစ်တစ်ခု publish လုပ်တိုင်း 'search index rebuild' နဲ့ 'notification ပို့ခြင်း' လို job တွေကို queue ထဲ enqueue လုပ်ပြီး၊ worker process က FIFO အစီအစဉ်အတိုင်း တစ်ခုချင်းစီ dequeue လုပ်ပြီး process လုပ်တယ်။

အတူတူ စမ်းရေးကြည့်မယ်

python
from collections import deque

task_queue = deque()

# enqueue: add new tasks to the back - O(1)
task_queue.append("index new lesson")
task_queue.append("rebuild search index")
task_queue.append("send notification")

# dequeue: process tasks from the front, in arrival order - O(1)
while task_queue:
    task = task_queue.popleft()
    print("processing:", task)

# A plain list would need task_queue.pop(0), which is O(n) because
# every remaining element has to shift left one slot each time.
You should see
Task သုံးခုကို enqueue လုပ်ခဲ့တဲ့ အစီအစဉ်အတိုင်း 'processing: index new lesson', 'processing: rebuild search index', 'processing: send notification' ဆိုပြီး တစ်ကြောင်းချင်းစီ print ထုတ်ပေးတယ်။

၅ မိနစ် စမ်းကြည့်

Priority job (ဥပမာ 'urgent fix') ကို queue ရဲ့ ရှေ့ဆုံးမှာ ထည့်ချင်ရင် `deque` ရဲ့ ဘယ် method ကို သုံးရမလဲ စမ်းရေးပြီး ရလဒ် print ကြည့်ပါ။

သတိလေးတစ်ချက်

Queue ကို plain list နဲ့ implement လုပ်ပြီး `pop(0)` သုံးတတ်တယ် — task အရေအတွက် များလာလေ၊ shift cost ကြောင့် queue ဟာ progressively နှေးလာလေဖြစ်တယ်

Deque ကို stack လို `append()`/`pop()` ချည်း (right end) သုံးမိရင် FIFO order မရဘဲ LIFO order ဖြစ်သွားနိုင်တယ် — queue ဖြစ်ဖို့ `popleft()` ကို သုံးရမယ်

Wikipedia — Queue (abstract data type)Data Structures & Algorithms

ဒီနေရာမှာ လူအများမှားတတ်တယ်

  • Queue ကို plain list နဲ့ implement လုပ်ပြီး `pop(0)` သုံးတတ်တယ် — task အရေအတွက် များလာလေ၊ shift cost ကြောင့် queue ဟာ progressively နှေးလာလေဖြစ်တယ်
  • Deque ကို stack လို `append()`/`pop()` ချည်း (right end) သုံးမိရင် FIFO order မရဘဲ LIFO order ဖြစ်သွားနိုင်တယ် — queue ဖြစ်ဖို့ `popleft()` ကို သုံးရမယ်
  • နမူနာ code ကို production system ပေါ် တိုက်ရိုက်မစမ်းဘဲ local/test environment တွင် အရင်အတည်ပြုပါ။

လေ့ကျင့်ခန်း

Priority job (ဥပမာ 'urgent fix') ကို queue ရဲ့ ရှေ့ဆုံးမှာ ထည့်ချင်ရင် `deque` ရဲ့ ဘယ် method ကို သုံးရမလဲ စမ်းရေးပြီး ရလဒ် print ကြည့်ပါ။

You'll know it worked when: Task သုံးခုကို enqueue လုပ်ခဲ့တဲ့ အစီအစဉ်အတိုင်း 'processing: index new lesson', 'processing: rebuild search index', 'processing: send notification' ဆိုပြီး တစ်ကြောင်းချင်းစီ print ထုတ်ပေးတယ်။

Queue — FIFO ဒေတာဖွဲ့စည်းပုံ | Thuta Learning