QUEUE
คุณสมบัติที่สำคัญ
- เป็นโครงสร้างข้อมูลแบบต่อเนื่อง
- มีการทำงานแบบ First
in First out (FIFO)
- จะต้องทำการเพิ่มข้อมูลทางด้านท้าย
(rear)
ของคิว
และลบข้อมูลทางด้านหน้า (front) ของคิวเท่านั้น
- การ
implement การทำงานแบบคิว อาจใช้ Array
หรือ
Linked List
แถวคอย
ประโยชน์ของคิว
- ลักษณะของคิวเหมือนแถวคอย
หรือการเข้าคิวรอซื้อของเป็นกลไกสำคัญสำหรับระบบปฏิบัติการ
- การส่งงานไปยังเครื่องพิมพ์ในระบบคอมพิวเตอร์
- ระบบการจัดการจราจรทางอากาศ
เป็นต้น
การสร้างคิว
- ใช้
pointer 2
ตัวในการลำดับคิว คือ front
และ
rear
- front
คือตำแหน่งที่ข้อมูลออก จะอยู่ด้านหน้าคิว
- Rear คือตำแหน่งที่ข้อมูลเข้า จะอยู่ด้านท้ายของคิว
แถวคอย
ปฏิบัติการกับคิว
- การเพิ่มข้อมูลเข้าไปในคิว(enqueue) หรือการ
insert
- การนำข้อมูลออกจากคิว (dequeue) หรือการ
delete
Queue
Implementation
- Array
- Linked List
ตัวอย่างการแทนคิวด้วย
Array, size = 6
Queue : Array Implementation
การเพิ่มข้อมูลเข้าในคิว(enqueue)
-ก่อนนำสมาชิกเข้าคิว
ต้องตรวจสอบว่าคิวเต็มหรือไม่ โดยที่ ถ้า rear
= maxQ แสดงว่าคิวเต็ม (เมื่อ maxQ คือขนาดของคิว)
-ถ้าคิวเต็ม (full)
จะไม่สามารถนำข้อมูลเข้าได้อีก
จะทำให้เกิดการล้นของคิว (queue
overflow)
-การนำสมาชิกเข้าในคิว
จะเข้าทางด้านท้ายคิว (rear)
-ดังนั้นการนำสมาชิกเข้าคิว จึงเป็นการเพิ่มค่าพอยน์เตอร์ rear
-หากมีสมาชิกในคิวเพียงค่าเดียวพอยน์เตอร์ rear และ front จะเท่ากัน
Queue : Array Implementation
การนำข้อมูลออกจากคิว
(dequeue)
-ก่อนนำสมาชิกออกจากคิว
ต้องตรวจสอบดูก่อนว่าคิวว่างเปล่าหรือไม่ โดยเงื่อนไขการตรวจสอบคือ front
= rear = 0
-ถ้าคิวว่าง
จะไม่สามารถนำสมาชิกออกไม่ได้ จะเกิดปรากฏการณ์ขาดแคลนคิว (queue
underflow)
-การนำสมาชิกออกจากคิว
จะทำด้านหน้าคิว (front)
-ดังนั้นการนำสมาชิกออกจากคิวจึงเป็นการเพิ่มค่าพอยน์เตอร์
front
คิวแบบวงกลม (Circular Queue)
เป็นการแก้ปัญหาคิวเต็ม
ทั้งที่ยังมีเนื้อที่ว่างอยู่
เป็นการใช้เนื้อที่ให้เกิดประโยชน์สูงสุด
ลักษณะของคิวแบบวงกลม
-เหมือนคิวธรรมดาคือมีตัวชี้ 2 ตัวคือ front และ rear สำหรับแสดงตำแหน่งหัวคิวและท้ายคิวตามลำดับ
-แตกต่างจากคิวธรรมดาคือ
คิวธรรมดาเมื่อ rear
ชี้อยู่ที่ตำแหน่งสุดท้ายของคิว
จะทำให้ไม่สามารถเพิ่มข้อมูลเข้าไปในคิวได้อีก
ทั้งที่บางครั้งยังมีที่ว่างเหลืออยู่ก็ตาม
-คิววงกลมจัดการปัญหานี้โดย กรณี rear ชี้อยู่ที่ตำแหน่งสุดท้ายของคิว
ถ้าหากมีการเพิ่มข้อมูล ค่าของ rear จะสามารถวนกลับมาชี้ยังตำแหน่งแรกสุดของคิวได้
-ดังนั้นคิววงกลมจะสามารถเพิ่มข้อมูลเข้าไปในคิวได้
จนกว่าคิวจะเต็มจริง ๆ
การดึงข้อมูลออกจากคิววงกลม (Dequeue)
- การตรวจสอบคิวเต็มในคิววงกลม (Full)
- การตรวจสอบว่าคิววงกลมมีข้อมูลเก็บอยู่จนเต็มหรือไม่นั้น จะมีวิธีการทดสอบที่แตกต่างจากการตรวจสอบคิวปกติ เนื่องจากคิววงกลมมีลักษณะวนเป็นวงกลม ดังนั้น ตำแหน่งของข้อมูลมีโอกาสที่จะวนจากตำแหน่งสูงสุดกลับมายังตำแหน่งที่ 1 ได้เสมอ
- ลักษณะค่าของ Front และ Rear เมื่อเกิดคิววงกลมเต็มมีอยู่ 2 แบบเมื่อ Front อยู่ที่ 1 และ Rear อยู่ที่ตำแหน่งสูงสุดของคิว นั่นคือ อยู่ที่ค่า Max เมื่อ Front อยู่ที่ตำแหน่งใดๆ ภายในคิววงกลม (ที่ไม่ใช่ตำแหน่งที่ 1) ค่าของ Rear ก็จะอยู่ตำแหน่งที่อยู่ด้านหน้าของ Front ไปอีก 1 ค่า (Rear = Front -1)
การเพิ่มข้อมูลเข้าไปในคิววงกลม (Enqueue)
- ต่างไปจากการเพิ่มข้อมูลเข้าไปในคิวปกติ ตรงที่เมื่อ Rear มีค่าไปถึงค่าสูงสุดของอาร์เรย์แล้ว ถ้าจะต้องมีการขยับเพิ่มขึ้น ค่า Rear ถัดไปก็คือ วนกลับมาที่ค่า 1 อีกครั้ง
-
ขั้นตอนการเพิ่มข้อมูลเข้าไปในคิววงกลม
ตรวจสอบดูก่อนว่าคิววงกลมเต็มหรือไม่
ถ้าเต็มก็ให้แจ้งผลออกไป
- เพิ่มค่าตำแหน่งของ Rear ให้ไปชี้ ณ ตำแหน่งถัดไป
โดยถ้าเดิมตำแหน่งของ Rear คือตำแหน่งสูงสุดของคิวแล้ว
ตำแหน่งถัดไปของ Rear ก็คือ 1 ส่วนถ้ากรณีเดิมตำแหน่งของ Rear อยู่ ณ ตำแหน่งใดๆ ก็ตาม
ตำแหน่งถัดไปก็คือ เพิ่มค่าขึ้นไปอีก 1
นำค่าที่ต้องการใส่ในคิวมาใส่ ณ
ตำแหน่งใหม่ของ Rear
กรณีถ้าค่าที่เพิ่งใส่เข้าไปเป็นค่าแรกของคิววงกลม
(Rear
= 1) ให้เลื่อน Front
มาชี้ที่ 1 ด้วย
การดึงข้อมูลออกจากคิววงกลม (Dequeue)
ขั้นตอนการดึงข้อมูลออกจากคิววงกลม
- ตรวจสอบคิววงกลมเป็นคิวว่างหรือไม่
ถ้าเป็นคิวว่างควรแจ้งออกมาว่าเป็นคิวว่าง
ถ้าไม่ใช่คิวว่าง
ให้นำข้อมูลตำแหน่ง Front ออกจากคิววงกลม (เก็บค่าไว้ในตัวแปร)
- ตรวจสอบดูว่า
ข้อมูลตัวที่กำลังจะถูกดึงนี้
เป็นข้อมูลตัวสุดท้ายที่เหลืออยู่ในวงกลม ถ้าไม่ ถ้าใช่ให้ย้ายค่า Front และ Rear กลับไปอยู่ ณ ตำแหน่งเริ่มต้น
-
ถ้าไม่ใช่ข้อมูลตัวสุดท้ายที่เหลืออยู่ ให้ตรวจสอบอีกว่า ข้อมูลตัวนี้มีค่า Front อยู่ทตำแหน่งสูงสุดในอาร์เรย์หรือไม่
ถ้าใช่ให้ย้าย Front ลงมาที่ตำแหน่งค่า 1
- ถ้าไม่ใช่ ให้เพิ่มค่า Front ขึ้นไปอีก 1 ค่า
ย้ายไปชี้ที่ตัวถัดไป
Tree
ทรีเป็นโครงสร้างที่มีความสัมพันธ์ในลักษณะลำดับชั้นสมาชิกแต่ละโหมดล้วนแต่มีความสัมพันธ์กันในลักษณะเหมือนครอบครัวเดียวกันโดยมีโหนดพ่อซึ่งอยู่ระดับที่เหนือกว่ามีเส้นเชื่อมโยงจากโหนดไปยังโหนดที่อยู่ระดับต่ำกว่าที่เรียกว่าโหนดลูก
องค์ประกอบของทรี
โหนด ( Node ) ที่ใช้สำหรับบรรจุข้อมูลโดยจะมีกิ่งซึ่งเป็นเส้นที่โยงโหนด
เข้า ด้วยกันที่เรียกปลาจำนวนของ บรานช์ (Branch) ที่สัมพันธ์กับโหนด
เรียกว่า
ดีกรี (Degree) และถ้าหากที่เป็นที่ที่ไม่ใช่ที่ว่างหนวดแรกจะเรียกรูท
(root) โดยโหนดทุก ๆ โหนดยกเว้นรูทโหนดจะมีเพียง 1 predecessor ในขณะ
ที่ successor อาจเป็น 0 หรือ 1 หรือมากกว่า 1
ก็ได้ สำหรับ Leaf ก็คือโหนดใบ
ที่ไม่มีบรานช์เชือมโยงไปยังโหนดถัดไปหรือโหนดที่ไม่มีตัวตามหลังหรือ Successor
นั่นเองในขณะที่
โหนดพ่อ (Parent) จะมี่โหนดตามหลังหรือโหนดลูก (Child)ต่อท้าย
โหนดลูกตั้งแต่สองโหนดหรือมากกว่าที่มาจากพ่อเดียวกันจะเรียกว่า โหนดพี่น้อง (Siblings)
โหนดต่าง ๆ ภายในทรีจะอยู่ในระดับที่ต่างกันโดยเริ่มต้นจากรูทโหนดซึ่งถือเป็นระดับ
แรกสุด(Level) ส่วนลูกๆ ของรูทโหนดก็คือระดับที่ 1 (Lelvel) และลูกๆ ของโหนด
ในระดับที่ 1 ก็จะอยู่ในระดับที่ 2 (Level
2) ซึ่งจะเพิ่มระดับไปเรื่อยๆเมื่อลูกหลานเพิ่ม
ขึ้น
ซับทรี (Subtrees)
หมายถึง
โครงสร้างที่เชื่อมต่อกันภายใต้ Root โดย
-
Node แรกของ Subtrees จะเป็น Root ของ Subtree นั้น และใช้เป็นชื่อเรียก Subtree
- Subtree สามารถแบ่งย่อยเป็น Subtree ได้อีกจนกว่าจะ Empty
ต้นไม้แบบไบนารี (Binary
Tree)
ไบนารีทรี หมายถึงทรีที่มีโหนดลูกไม่เกิน สองโหนด
ประกอบด้วยโหนดลูกทางซ้าย
(Left
child)และโหนดลูกทางขวา(Right
child) โหนดลูกอาจเป็นทรีย่อย
ก็ได้ซึ่งแบ่งออกเป็น
ทรี ย่อยทางซ้ายและทรีย่อยทางขวาและโหนดลูกแต่ละโหนด
อาจมีหนดลูกเพียงด้านซ้ายหรือด้านขวาด้านเดียวก็ได้สำหรับโหนดของทรีมีจำนวน
เป็น 0 เรียกว่าทรีว่าง (Empty
Tree)
การท่องผ่าน Binary
tree
การท่องผ่านโหนดหมายถึงการเข้าไปในโครงสร้างต้นไม้เพื่อนำข้อมูลในโหนดมา
แสดงหรือเพื่อการค้นหาเพื่อประมวลผลการเดินเยี่ยมโหนดมี 3 วิธี
1.
imorder trabersal หรือ symmetric
order จะทำการเยี่ยมโหนดในต้นไม้
ย่อยทางซ้ายแบบอินออเดอร์ก่อนเยี่ยมโหนดรากและเยี่ยมโหนดในต้นไม้ย่อยทางขวาแบบ
อินออเดอร์(Left/ Root/ Right)
2. preorder traversal จะทำการเยี่ยมโหนดรากก่อน เยี่ยมโหนดในต้นไม้ย่อยทาง
ซ้ายแบบ พรีออเดอร์ และเยี่ยมโหนดในต้นไม้ย่อยทางขวาแบบพรีออเดอร์
(Root/Left/Right)
3.
postorder
traversal หรือ Endorder จะทำการเยี่ยมโหนดในต้นไม้ย่อยทาง
ซ้ายแบบ
โพสออเดอร์ก่อนเยี่ยมโหนดในต้นไม้ย่อยทางขวาแบบโพสออเดอร์และเยี่ยมโหนด
ราก(Left/Right/Root)
ไม่มีความคิดเห็น:
แสดงความคิดเห็น