E N D
อ.วรพจน์ พรหมจักร Queue structure
Queues Structure โครงสร้างการทำงานแบบคิวคือการมีการจัดลำดับการเข้าและออกข้อมูลอย่างเป็นลำดับ ข้อมูลใดเข้ามาก่อนก็จะดำเนินการก่อน หากข้อมูลใดเข้ามาทีหลังก็จะดำเนินการทีหลัง เรียกลักษณะของการดำเนินการแบบนี้ว่า First In First Out (FIFO) หรือเข้าก่อนออกก่อน
ลักษณะของคิว • โครงสร้างข้อมูลแบบคิวเป็นโครงสร้างเชิงเส้นและไม่เชิงเส้น • มีทางเข้าและออก 2 ทาง • มีการทำงานแบบลำดับ • สามารถนำข้อมูลเข้าและนำข้อมูลออกสลับกันได้ • มีลำดับการทำงานแบบเข้าก่อนออกก่อน (FIFO)
ประเภทของคิว มี 3ปรเภท • คิวธรรมดา (Queue) • คิววงกลม (Circular Queue) • คิวที่เรียงลำดับตามความสำคัญ (Priority Queue)
การดำเนินการของคิว เมื่อนำเข้าข้อมูลจะต้องจัดเรียงในลักษณะการต่อท้ายกัน • ข้อมูลที่อยู่ส่วนท้ายของการเก็บข้อมูล เรียกว่า Rear • ข้อมูลที่อยู่ส่วนหัวของการเก็บข้อมูล ซึ่งจะเรียกว่า Front • การนำข้อมูลเข้าไปในคิว เรียกว่า Insert (Enqueue) • การนำข้อมูลออกจากคิว เรียกว่า Remove (Dequeue)
คิวธรรมดา (Queue) Rear Front
คิวธรรมดา (Queue) • คิวธรรมดา หมายถึง คิวที่มีการนำข้อมูลเข้าทางท้ายคิว (Rear)และนำข้อมูลออกหางคิว (Front) โดยถ้าท้ายคิวไปอยู่ที่ตำแหน่งท้ายสุดของคิวแล้ว ถึงแม้จะมีช่องว่างเหลือที่หัวคิวก็ไม่สามารถนำข้อมูลใหม่ไปเก็บได้ จนกว่าจะนำข้อมูลในคิวออกให้หมดก่อนจึงเริ่มนำข้อมูลใหม่ไปเก็บได้
การนำข้อมูลเข้า Enqueue • ก่อนนำสมาชิกเข้าคิว ต้องตรวจสอบว่าคิวเต็มหรือไม่ โดยที่ ถ้า rear = maxQแสดงว่าคิวเต็ม (เมื่อ maxQคือขนาดของคิว) • การนำข้อมูลใหม่เข้ามาแถวคอย จะเพิ่มเข้ามาด้านหลัง • และจะนำเข้ามาเรื่อย ๆ จนเต็ม หรือเรียกว่า แถวคอยเต็ม (Queue Overflow) • ดังนั้นการนำสมาชิกเข้าคิว จึง เป็นการเพิ่มค่าพอยน์เตอร์rear • หากมีสมาชิกในคิวเพียงค่าเดียวพอยน์เตอร์rear และ front จะเท่ากัน
การนำข้อมูลเข้า Enqueue Queue Overflow 10 30 20 40 F=R=0 F R R R R
โครงสร้างของการแทนคิวด้วยอาร์เรย์โครงสร้างของการแทนคิวด้วยอาร์เรย์ Max E A B C D พื้นที่ว่าง Front Rear Front = Rear = 1 5
การนำข้อมูลเข้า Enqueue Max G H I J E F A B C D F=R=0 F R R R R R R R R R R Queue Overflow Front = Rear = 1 10
Queue : Array Implementation ตรวจสอบว่าคิวเต็มหรือไม่ ตรวจสอบว่าคิวว่างเปล่าหรือไม่ ถ้า front = 0 แสดงว่าคิวว่างเปล่า นั่นคือยังไม่มีข้อมูลในคิว หมายเหตุ Q คือชื่อคิว maxQคือขนาดของคิว Item คือข้อมูลที่ต้องการเพิ่มเข้าไปในคิว 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
Queue : Array Implementation Empty queue front = rear = 0 Enqueue(A) front front rear rear Enqueue(B) การนำสมาชิกเข้าคิว (enqueue)
Queue : Array Implementation Enqueue (C) Enqueue (D) front front rear rear Enqueue (E) Error : Overflow การนำสมาชิกเข้าคิว (enqueue) (ต่อ)
การนำข้อมูลออก Dequeue • ก่อนนำสมาชิกออกจากคิว ต้องตรวจสอบดูก่อนว่าคิวว่างเปล่าหรือไม่ โดยเงื่อนไขการตรวจสอบคือ front = rear = 0 • ข้อมูลที่จะนำออกก่อนจะเป็นข้อมูลที่อยู่ ด้านหน้า • สามารถนำข้อมูลออกเรื่อย ๆ จนไม่มีข้อมูล หรือเรียกว่า แถวคอยว่าง (Queue Underflow) • ดังนั้นการนำสมาชิกออกจากคิวจึง เป็นการเพิ่มค่าพอยน์เตอร์front
การนำข้อมูลออก Dequeue Max G H I J E F A B C D F=R=0 F F F F F F R F F F F Queue Underflow Front = Rear = 10 10
การนำข้อมูลออก Dequeue 10 40 20 30 F=R=0 F F F F R Queue Underflow
Queue : Array Implementation ตรวจสอบว่าคิวว่างเปล่าหรือไม่ ตรวจสอบว่ามีข้อมูลในคิวเพียงค่าเดียวหรือไม่ ซึ่งถ้า front = rear แสดงว่ามีข้อมูลในคิวเพียงค่าเดียว เมื่อต้องการลบข้อมูลออกจะทำให้ไม่เหลือข้อมูลใด ๆ ในคิว จึงทำการกำหนดให้ค่า front และ rear มีค่าเป็น 0 ซึ่งเป็นการแสดงให้เห็นว่าคิวว่างเปล่า Remove-Q algorithm if( rear == 0) write “Underflow” else if(front==rear) front ← 0 rear ← 0 else front ← front + 1
Queue : Array Implementation dequeue front rear rear front front rear dequeue การนำสมาชิกออกจากคิว (dequeue)
Queue : Array Implementation dequeue dequeue front = rear = 0 front rear dequeue Error : Underflow การนำสมาชิกออกจากคิว (dequeue) (ต่อ)
คิววงกลม (Circular Queue) คิววงกลม หมายถึง คิวที่ถูกออกแบบมาให้มีลักษณะเป็นวงกลมเพื่อให้สามารถนำข้อมูลใหม่ไปเก็บไว้ที่ช่องว่างด้านหน้าคิวได้ คิววงกลมออกแบบมาเพื่อแก้ปัญหาคิวธรรมดา
คิววงกลม (Circular Queue) • ลักษณะของคิวแบบวงกลม • เหมือนคิวธรรมดาคือมีตัวชี้ 2 ตัวคือ front และ rear สำหรับแสดงตำแหน่งหัวคิวและท้ายคิวตามลำดับ • แตกต่างจากคิวธรรมดาคือ คิวธรรมดาเมื่อ rear ชี้อยู่ที่ตำแหน่งสุดท้ายของคิว จะทำให้ไม่สามารถเพิ่มข้อมูลเข้าไปในคิวได้อีก ทั้งที่บางครั้งยังมีที่ว่างเหลืออยู่ก็ตาม
Circular Queue • ลักษณะของคิวแบบวงกลม (ต่อ) • คิววงกลมจัดการปัญหานี้โดย กรณี rear ชี้อยู่ที่ตำแหน่งสุดท้ายของคิว ถ้าหากมีการเพิ่มข้อมูล ค่าของ rear จะสามารถวนกลับมาชี้ยังตำแหน่งแรกสุดของคิวได้ • ดังนั้นคิววงกลมจะสามารถเพิ่มข้อมูลเข้าไปในคิวได้ จนกว่าคิวจะเต็มจริง ๆ
Circular Queue Enqueue(A) front front rear rear rear front Enqueue(B) การนำข้อมูลเข้าคิววงกลม
Circular Queue Dequeue front rear front rear rear front Dequeue การนำสมาชิกออกจากคิววงกลม
front=1 F G H I J rear=5 Circular Queue
rear=12 rear=7 rear=6 rear=5 Circular Queue front=1 P Q O F Enqueue G N QueueisFull H M I L J K
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
rear=12 rear=1 front=3 rear=2 Circular Queue P Q R O Enqueue S N QueueisFull H M I L J K
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
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
คิวลำดับความสำคัญ หรือ แถวคอยเชิงบุริมภาพ(Priority Queue) บางครั้งเราพบว่า การเข้ารับบริการ ไม่เป็นไปตามกฎของคิว เนื่องจากได้รับอภิสิทธิ์ (priority) ให้สามารถเข้ารับบริการก่อนได้เช่น ลูกค้าประจำจะได้รับการบริการก่อน ถึงแม้จะเข้ามาทีหลังลูกค้าจรคนอื่นที่คอยอยู่ก็ตาม หรือในร้านถ่ายเอกสาร ถ้าพนักงานกำลังถ่ายเอกสารให้ลูกค้าคนหนึ่งจำนวน 100 หน้า แล้วมีลูกค้าใหม่มาขอถ่ายเพียงแค่ 2 หน้า พนักงานก็บริการให้ลูกค้าคนใหม่นั้นทันที
คิวลำดับความสำคัญ หรือ แถวคอยเชิงบุริมภาพ(Priority Queue) • ใน คิวธรรมดา ข้อมูลที่เข้ามาก่อนจะมีสิทธิ์ออกก่อน (First In First Out:FIFO) อย่างไรก็ตาม มีบางครั้งที่เราต้องยกให้สมาชิกบางประเภทได้ทำงานก่อนทั้งที่มาทีหลัง เช่น การให้คิวงานที่เล็กกว่าได้ทำก่อน หรือ การให้สิทธิพิเศษแก่การทำงานบางประเภท • คิวลำดับความสำคัญทำให้เราสามารถประยุกต์ใช้คิวได้ดีขึ้น เนื่องจากเพิ่มการให้ความสำคัญของสมาชิกที่แตกต่างกัน ส่งผลให้เราสามารถจัดเรียงคิวได้ใหม่ให้เหมาะสมกับการทำงานได้ เราใช้คิวลำดับความสำคัญในการจัดการทำงานการตรวจนับ
คิวลำดับความสำคัญ หรือ แถวคอยเชิงบุริมภาพ(Priority Queue)
Priority Queue ในการทำงานกับคิวแบบนี้ ต้องมีค่าอภิสิทธิ์ของแต่ละสมาชิกเก็บไว้ด้วย เพื่อใช้หาตำแหน่งที่อยู่ก่อนหน้าสมาชิกที่มีอภิสิทธิ์ต่ำกว่าและตามหลังสมาชิกที่มีอภิสิทธิ์เท่ากันหรือสูงกว่า • typedefstruct { intpriority; chardata; } Queue; Queuepriority_queue[15];
Priority Queue ... rear = 5 front = 1
rear = 5 front = 1 Priority Queue ... ต้องการแทรก W ที่มีอภิสิทธิ์เท่ากับ 2
rear = 6 front = 1 Priority Queue ... หลังแทรก W ที่มีอภิสิทธิ์เท่ากับ 2
แบบฝึกหัด Queue • คิว (Queue) หมายถึงอะไร • คิวมีลักษณะที่สำคัญอย่างไร • คิวแบ่งออกเป็นกี่ประเภท อะไรบ้าง • คิววงกลมมีลักษณะอย่างไร
แบบฝึกหัด Queue • ให้พิจารณาคิววงกลม ที่มีจำนวนช่องเก็บข้อมูล 5 ช่อง ซึ่งมีข้อมูลจัดเก็บ เป็นดังนี้ 1 2 3 4 5 จงวาดรูปของคิวตามการดำเนินการตามลำดับ ดังต่อไปนี้ • J เข้ามาในคิว • นำข้อมูลออกจากคิว • นำข้อมูลออกจากคิว • K เข้ามาในคิว Front Rear