1 / 44

โครงสร้างข้อมูลแบบคิว

โครงสร้างข้อมูลแบบคิว. Queue. Queue. คุณสมบัติที่สำคัญ เป็นโครงสร้างข้อมูลแบบต่อเนื่อง มีการทำงานแบบ First in First out (FIFO) จะต้องทำการ เพิ่มข้อมูลทางด้านท้าย (rear) ของคิว และ ลบข้อมูลทางด้านหน้า (front) ของคิวเท่านั้น การ implement การทำงานแบบคิว อาจใช้ Array หรือ Linked List.

brooks
Download Presentation

โครงสร้างข้อมูลแบบคิว

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. โครงสร้างข้อมูลแบบคิวโครงสร้างข้อมูลแบบคิว Queue

  2. Queue • คุณสมบัติที่สำคัญ • เป็นโครงสร้างข้อมูลแบบต่อเนื่อง • มีการทำงานแบบ First in First out (FIFO) • จะต้องทำการเพิ่มข้อมูลทางด้านท้าย (rear) ของคิว และลบข้อมูลทางด้านหน้า(front) ของคิวเท่านั้น • การ implement การทำงานแบบคิว อาจใช้ Arrayหรือ Linked List implement แถวคอย

  3. Queue • ประโยชน์ของคิว ลักษณะของคิวเหมือนแถวคอย หรือการเข้าคิวรอซื้อของ • เป็นกลไกสำคัญสำหรับระบบปฏิบัติการ • การส่งงานไปยังเครื่องพิมพ์ในระบบคอมพิวเตอร์ • ระบบการจัดการจราจรทางอากาศ • เป็นต้น

  4. Queue • การสร้างคิว • ใช้ pointer 2ตัวในการลำดับคิว คือ front และ rear • front คือตำแหน่งที่ข้อมูลออก จะอยู่ด้านหน้าคิว • Rear คือตำแหน่งที่ข้อมูลเข้า จะอยู่ด้านท้ายของคิว front rear ออก เข้า แถวคอย

  5. Queue • ปฏิบัติการกับคิว • การเพิ่มข้อมูลเข้าไปในคิว(enqueue) หรือการ insert • การนำข้อมูลออกจากคิว (dequeue) หรือการ delete

  6. Queue Implementation Array Linked List

  7. Queue: Array Implementation • ตัวอย่างการแทนคิวด้วย Array, size = 5 front = rear = 0 เพิ่ม A เพิ่ม B, C ลบ A front = rear = 1 ออก front = 1 rear = 3 เข้า front = 2 rear = 3

  8. Queue : Array Implementation • การเพิ่มข้อมูลเข้าในคิว(enqueue) • ก่อนนำสมาชิกเข้าคิว ต้องตรวจสอบว่าคิวเต็มหรือไม่ โดยที่ ถ้า rear = maxQ แสดงว่าคิวเต็ม (เมื่อ maxQ คือขนาดของคิว) • ถ้าคิวเต็ม (full) จะไม่สามารถนำข้อมูลเข้าได้อีก จะทำให้เกิดการล้นของคิว (queue overflow) • การนำสมาชิกเข้าในคิว จะเข้าทางด้านท้ายคิว (rear) • ดังนั้นการนำสมาชิกเข้าคิว จึงเป็นการเพิ่มค่าพอยน์เตอร์ rear • หากมีสมาชิกในคิวเพียงค่าเดียวพอยน์เตอร์ rear และ front จะเท่ากัน

  9. Queue : Array Implementation • INSERT-Q Algorithm front = rear = 0 if( rear == maxQ) write “Overflow” else if(front==0) front ← 1 rear ← 1 Q[rear] ← Item else rear ← rear + 1 Q[rear] ← Item ตรวจสอบว่าคิวเต็มหรือไม่ ตรวจสอบว่าคิวว่างเปล่าหรือไม่ ถ้า front = 0 แสดงว่าคิวว่างเปล่า นั่นคือยังไม่มีข้อมูลในคิว หมายเหตุ Q คือชื่อคิว maxQ คือขนาดของคิว Item คือข้อมูลที่ต้องการเพิ่มเข้าไปในคิว

  10. Queue : Array Implementation • การนำสมาชิกเข้าคิว (enqueue) Empty queue front = rear = 0 Enqueue(A) front front rear rear Enqueue(B)

  11. Queue : Array Implementation • การนำสมาชิกเข้าคิว (enqueue) (ต่อ) Enqueue (C) Enqueue(D) front front rear rear Enqueue(E) Error : Overflow

  12. Queue : Array Implementation • การนำข้อมูลออกจากคิว (dequeue) • ก่อนนำสมาชิกออกจากคิว ต้องตรวจสอบดูก่อนว่าคิวว่างเปล่าหรือไม่ โดยเงื่อนไขการตรวจสอบคือ front = rear = 0 • ถ้าคิวว่าง จะไม่สามารถนำสมาชิกออกไม่ได้ จะเกิดปรากฏการณ์ขาดแคลนคิว (queue underflow) • การนำสมาชิกออกจากคิว จะทำด้านหน้าคิว (front) • ดังนั้นการนำสมาชิกออกจากคิวจึงเป็นการเพิ่มค่าพอยน์เตอร์ front

  13. Queue : Array Implementation • DELETE-Q algorithm if( rear == 0) write “Underflow” else if(front==rear) front ← 0 rear ← 0 else front ← front + 1 ตรวจสอบว่าคิวว่างเปล่าหรือไม่ ตรวจสอบว่ามีข้อมูลในคิวเพียงค่าเดียวหรือไม่ ซึ่งถ้า front = rear แสดงว่ามีข้อมูลในคิวเพียงค่าเดียว เมื่อต้องการลบข้อมูลออกจะทำให้ไม่เหลือข้อมูลใด ๆ ในคิว จึงทำการกำหนดให้ค่า front และ rear มีค่าเป็น 0 ซึ่งเป็นการแสดงให้เห็นว่าคิวว่างเปล่า

  14. Queue : Array Implementation • การนำสมาชิกออกจากคิว (dequeue) dequeue front front front rear rear rear dequeue

  15. Queue : Array Implementation • การนำสมาชิกออกจากคิว (dequeue) (ต่อ) dequeue dequeue front = rear = 0 front rear dequeue Error : Underflow

  16. rear B Queue: Linked List Implementation front A D X struct node { char name; struct node *link; }

  17. rear B rear Queue: Linked List Implementation front A D X F X void enqueue (datatypenewdata) { ... rearlink = newnode; rear = newnode; }

  18. rear A B Queue: Linked List Implementation front D F X char dequeue() { … deldata = frontdata; front = front  link; … }

  19. Queue: Linked List Implementation How to detect that a queue is either full or empty ?

  20. Practices 1 Imagine we have a queue of integer, Q, size = 6. Draw picture of both structures after the following operations: 1. enqueue(Q,5) 7. enqueue(Q,15) 2. enqueue(Q,1) 8. enqueue(Q,6) 3. enqueue(Q,7) 9. dequeue(Q) 4. enqueue(Q,3) 10. dequeue(Q) 5. dequeue(Q) 11. enqueue(Q,10) 6. dequeue(Q) 12. enqueue(Q,9) จัดทำโดย อ.ดารารัตน์ แซ่ลี้ ภาควิชาวิทยาการคอมพิวเตอร์ คณะวิทยาศาสตร์ มหาวิทยาลัยสงขลานครินทร์

  21. Queue • คิวแบบวงกลม (Circular Queue) • เป็นการแก้ปัญหาคิวเต็ม ทั้งที่ยังมีเนื้อที่ว่างอยู่ • เป็นการใช้เนื้อที่ให้เกิดประโยชน์สูงสุด ว่าง front rear คิวว่าง แต่ไม่สามารถเพิ่มข้อมูลเข้าไปได้อีก เนื่องจาก rear = maxQ

  22. J G H rear=7 front=5 front=5 rear rear=8 rear Problem with Array Implementation (size = 7) maxq Enqueue K Error : Overflow J G H จัดทำโดย อ.ดารารัตน์ แซ่ลี้ ภาควิชาวิทยาการคอมพิวเตอร์ คณะวิทยาศาสตร์ มหาวิทยาลัยสงขลานครินทร์

  23. Circular Queue • ลักษณะของคิวแบบวงกลม • เหมือนคิวธรรมดาคือมีตัวชี้ 2 ตัวคือ front และ rear สำหรับแสดงตำแหน่งหัวคิวและท้ายคิวตามลำดับ • แตกต่างจากคิวธรรมดาคือ คิวธรรมดาเมื่อ rear ชี้อยู่ที่ตำแหน่งสุดท้ายของคิว จะทำให้ไม่สามารถเพิ่มข้อมูลเข้าไปในคิวได้อีก ทั้งที่บางครั้งยังมีที่ว่างเหลืออยู่ก็ตาม

  24. Circular Queue • ลักษณะของคิวแบบวงกลม (ต่อ) • คิววงกลมจัดการปัญหานี้โดย กรณี rear ชี้อยู่ที่ตำแหน่งสุดท้ายของคิว ถ้าหากมีการเพิ่มข้อมูล ค่าของ rear จะสามารถวนกลับมาชี้ยังตำแหน่งแรกสุดของคิวได้ • ดังนั้นคิววงกลมจะสามารถเพิ่มข้อมูลเข้าไปในคิวได้ จนกว่าคิวจะเต็มจริง ๆ

  25. Circular Queue • การนำข้อมูลเข้าคิววงกลม Enqueue(A) front front front rear rear rear Enqueue(B)

  26. Circular Queue • การนำสมาชิกออกจากคิววงกลม Dequeue front front front rear rear rear Dequeue

  27. front=1 F G H I J rear=5 Circular Queue จัดทำโดย อ.ดารารัตน์ แซ่ลี้ ภาควิชาวิทยาการคอมพิวเตอร์ คณะวิทยาศาสตร์ มหาวิทยาลัยสงขลานครินทร์

  28. rear=12 rear=7 rear=5 rear=6 Circular Queue front=1 P Q O F Enqueue G N Queue is Full H M I L J K จัดทำโดย อ.ดารารัตน์ แซ่ลี้ ภาควิชาวิทยาการคอมพิวเตอร์ คณะวิทยาศาสตร์ มหาวิทยาลัยสงขลานครินทร์

  29. rear=12 front=1 front=3 front=2 Circular Queue P Q F O Dequeue G N H M I L J K 2 rooms available จัดทำโดย อ.ดารารัตน์ แซ่ลี้ ภาควิชาวิทยาการคอมพิวเตอร์ คณะวิทยาศาสตร์ มหาวิทยาลัยสงขลานครินทร์

  30. rear=12 rear=1 front=3 rear=2 Circular Queue P Q R O Enqueue S N Queue is Full H M I L J K จัดทำโดย อ.ดารารัตน์ แซ่ลี้ ภาควิชาวิทยาการคอมพิวเตอร์ คณะวิทยาศาสตร์ มหาวิทยาลัยสงขลานครินทร์

  31. Array Implementation J F G H I rear=1 front=4 subprogram enqueue (datatypenewdata) 1. rear  rear+1 2. if (rear == maxq) 2.1 rear  1 3. return จัดทำโดย อ.ดารารัตน์ แซ่ลี้ ภาควิชาวิทยาการคอมพิวเตอร์ คณะวิทยาศาสตร์ มหาวิทยาลัยสงขลานครินทร์

  32. Array Implementation J F G H I rear=1 front=4 subprogram dequeue (datatypeolddata) 1. front  front+1 2. if (front == maxq) 2.1 front  1 3. return จัดทำโดย อ.ดารารัตน์ แซ่ลี้ ภาควิชาวิทยาการคอมพิวเตอร์ คณะวิทยาศาสตร์ มหาวิทยาลัยสงขลานครินทร์

  33. Question How can we know that a circular queue (array and linked list) is empty or full ? จัดทำโดย อ.ดารารัตน์ แซ่ลี้ ภาควิชาวิทยาการคอมพิวเตอร์ คณะวิทยาศาสตร์ มหาวิทยาลัยสงขลานครินทร์

  34. Practices 2 Imagine we have a Circular queue of integer, Q, size = 6. Draw picture of both structures after the following operations: 1. enqueue(Q,5) 7. enqueue(Q,15) 2. enqueue(Q,1) 8. enqueue(Q,6) 3. enqueue(Q,7) 9. dequeue(Q) 4. enqueue(Q,3) 10. dequeue(Q) 5. dequeue(Q) 11. enqueue(Q,10) 6. dequeue(Q) 12. enqueue(Q,9) จัดทำโดย อ.ดารารัตน์ แซ่ลี้ ภาควิชาวิทยาการคอมพิวเตอร์ คณะวิทยาศาสตร์ มหาวิทยาลัยสงขลานครินทร์

  35. Priority Queue บางครั้งเราพบว่า การเข้ารับบริการ ไม่เป็นไปตามกฎของคิว เนื่องจากได้รับอภิสิทธิ์ (priority) ให้สามารถเข้ารับบริการก่อนได้เช่น ลูกค้าประจำจะได้รับการบริการก่อน ถึงแม้จะเข้ามาทีหลังลูกค้าจรคนอื่นที่คอยอยู่ก็ตาม หรือในร้านถ่ายเอกสาร ถ้าพนักงานกำลังถ่ายเอกสารให้ลูกค้าคนหนึ่งจำนวน 100 หน้า แล้วมีลูกค้าใหม่มาขอถ่ายเพียงแค่ 2 หน้า พนักงานก็บริการให้ลูกค้าคนใหม่นั้นทันที จัดทำโดย อ.ดารารัตน์ แซ่ลี้ ภาควิชาวิทยาการคอมพิวเตอร์ คณะวิทยาศาสตร์ มหาวิทยาลัยสงขลานครินทร์

  36. Priority Queue ในการทำงานกับคิวแบบนี้ ต้องมีค่าอภิสิทธิ์ของแต่ละสมาชิกเก็บไว้ด้วย เพื่อใช้หาตำแหน่งที่อยู่ก่อนหน้าสมาชิกที่มีอภิสิทธิ์ต่ำกว่าและตามหลังสมาชิกที่มีอภิสิทธิ์เท่ากันหรือสูงกว่า • typedef struct { int priority; char data; } Queue; Queue priority_queue[15]; จัดทำโดย อ.ดารารัตน์ แซ่ลี้ ภาควิชาวิทยาการคอมพิวเตอร์ คณะวิทยาศาสตร์ มหาวิทยาลัยสงขลานครินทร์

  37. Priority Queue ... rear = 5 front = 1 จัดทำโดย อ.ดารารัตน์ แซ่ลี้ ภาควิชาวิทยาการคอมพิวเตอร์ คณะวิทยาศาสตร์ มหาวิทยาลัยสงขลานครินทร์

  38. rear = 5 front = 1 Priority Queue ... ต้องการแทรก W ที่มีอภิสิทธิ์เท่ากับ 2 จัดทำโดย อ.ดารารัตน์ แซ่ลี้ ภาควิชาวิทยาการคอมพิวเตอร์ คณะวิทยาศาสตร์ มหาวิทยาลัยสงขลานครินทร์

  39. rear = 6 front = 1 Priority Queue ... หลังแทรก W ที่มีอภิสิทธิ์เท่ากับ 2 จัดทำโดย อ.ดารารัตน์ แซ่ลี้ ภาควิชาวิทยาการคอมพิวเตอร์ คณะวิทยาศาสตร์ มหาวิทยาลัยสงขลานครินทร์

  40. Practices 4 Imagine we have a priority queueof integer, Q size = 5. Draw picture of both structures after the following operations: operation (Q, pri, data) 1. enqueue(Q,1,7) 7. enqueue(Q,3,1) 2. enqueue(Q,1,4) 8. dequeue(Q,x) 3. enqueue(Q,3,3) 9. dequeue(Q,y) 4. dequeue(Q,x) 10. enqueue(Q,2,y) 5. enqueue(Q,2,9) 11. enqueue(Q,3,x) 6. enqueue(Q,1,x) 12. enqueue(Q,2,2) จัดทำโดย อ.ดารารัตน์ แซ่ลี้ ภาควิชาวิทยาการคอมพิวเตอร์ คณะวิทยาศาสตร์ มหาวิทยาลัยสงขลานครินทร์

  41. Priority Queue • Array Implementation • Linked List Implementation จัดทำโดย อ.ดารารัตน์ แซ่ลี้ ภาควิชาวิทยาการคอมพิวเตอร์ คณะวิทยาศาสตร์ มหาวิทยาลัยสงขลานครินทร์

  42. Priority Queue Which kind of implementation either array or linked list that we should choose for Priority Queue Implementation? จัดทำโดย อ.ดารารัตน์ แซ่ลี้ ภาควิชาวิทยาการคอมพิวเตอร์ คณะวิทยาศาสตร์ มหาวิทยาลัยสงขลานครินทร์

  43. Practices 5 Imagine we have a priority circular queue of integer, Q size = 5. Draw picture of both structures after the following operations: 1. enqueue(Q,1,7) 7. enqueue(Q,3,1) 2. enqueue(Q,1,4) 8. dequeue(Q,x) 3. enqueue(Q,3,3) 9. dequeue(Q,y) 4. dequeue(Q,x) 10. enqueue(Q,2,y) 5. enqueue(Q,2,9) 11. enqueue(Q,3,x) 6. enqueue(Q,1,x) 12. enqueue(Q,2,2) จัดทำโดย อ.ดารารัตน์ แซ่ลี้ ภาควิชาวิทยาการคอมพิวเตอร์ คณะวิทยาศาสตร์ มหาวิทยาลัยสงขลานครินทร์

  44. การกระทำสิ่งใดๆที่ขาดศีลธรรม คุณธรรม และมนุษยธรรม ย่อมเป็นสิ่งที่อันตรายต่อผู้คน สังคม และประเทศชาติ คนเก่งมีเยอะ แต่คนที่ทั้งเก่งและดีนั้นหายาก จัดทำโดย อ.ดารารัตน์ แซ่ลี้ ภาควิชาวิทยาการคอมพิวเตอร์ คณะวิทยาศาสตร์ มหาวิทยาลัยสงขลานครินทร์

More Related