คิวลำดับความสำคัญในโครงสร้างข้อมูล: ลักษณะ, ประเภท & การนำไปใช้
เผยแพร่แล้ว: 2021-05-02สารบัญ
บทนำ
คิวลำดับความสำคัญใน โครงสร้าง ข้อมูล เป็นส่วนขยายของคิว "ปกติ" เป็นชนิดข้อมูลนามธรรมที่มีกลุ่มของรายการ มันเหมือนกับคิว "ปกติ" ยกเว้นว่าองค์ประกอบการดีคิวจะเป็นไปตามลำดับความสำคัญ ลำดับความสำคัญจะยกเลิกรายการเหล่านั้นก่อนที่มีลำดับความสำคัญสูงสุด บล็อกนี้จะช่วยให้คุณเข้าใจลึกซึ้งยิ่งขึ้นเกี่ยวกับลำดับความสำคัญและการนำไปใช้ในภาษาซี
คิวลำดับความสำคัญคืออะไร
เป็นชนิดข้อมูลนามธรรมที่ให้วิธีการรักษาชุดข้อมูล คิว "ปกติ" ตามรูปแบบการเข้าก่อนออกก่อน มัน dequeues องค์ประกอบในลำดับเดียวกันตามในขณะที่ดำเนินการแทรก อย่างไรก็ตาม ลำดับองค์ประกอบในคิวลำดับความสำคัญขึ้นอยู่กับลำดับความสำคัญขององค์ประกอบในคิวนั้น คิวลำดับความสำคัญจะย้ายองค์ประกอบที่มีลำดับความสำคัญสูงสุดที่จุดเริ่มต้นของคิวที่มีลำดับความสำคัญและองค์ประกอบที่มีลำดับความสำคัญต่ำสุดที่ด้านหลังของคิวที่มีลำดับความสำคัญ
รองรับเฉพาะองค์ประกอบที่เปรียบเทียบได้ ดังนั้น คิวลำดับความสำคัญใน โครงสร้างข้อมูลจะ จัดเรียงองค์ประกอบตามลำดับจากน้อยไปมากหรือจากมากไปน้อย
คุณสามารถนึกถึงคิวลำดับความสำคัญได้เนื่องจากผู้ป่วยหลายรายรอเข้าแถวที่โรงพยาบาล ที่นี่ สถานการณ์ของผู้ป่วยกำหนดลำดับความสำคัญ ผู้ป่วยที่มีอาการบาดเจ็บรุนแรงที่สุดจะเป็นคิวแรก
ลักษณะของคิวลำดับความสำคัญคืออะไร
คิวจะเรียกว่าคิวลำดับความสำคัญหากมีลักษณะดังต่อไปนี้:
- แต่ละรายการมีลำดับความสำคัญบางอย่างที่เกี่ยวข้อง
- รายการที่มีลำดับความสำคัญสูงสุดจะถูกย้ายไปที่ด้านหน้าและลบออกก่อน
- หากองค์ประกอบสองรายการมีค่าลำดับความสำคัญเท่ากัน คิวลำดับความสำคัญจะเป็นไปตามหลักการเข้าก่อน-ออกก่อนสำหรับการดำเนินการคิว
คิวลำดับความสำคัญมีกี่ประเภท
คิวลำดับความสำคัญมีสองประเภท:
- คิวลำดับความสำคัญจากน้อยไปมาก
- คิวลำดับความสำคัญของคำสั่งซื้อจากมากไปน้อย
คิวลำดับความสำคัญจากน้อยไปมาก
คิวลำดับความสำคัญของลำดับจากน้อยไปมากจะให้ความสำคัญสูงสุดกับจำนวนที่ต่ำกว่าในคิวนั้น ตัวอย่างเช่น คุณมีตัวเลขหกตัวในคิวลำดับความสำคัญที่ 4, 8, 12, 45, 35, 20 อันดับแรก คุณจะจัดเรียงตัวเลขเหล่านี้ในลำดับจากน้อยไปมาก รายการใหม่มีดังนี้ 4, 8, 12, 20. 35, 45. ในรายการนี้ 4 เป็นตัวเลขที่น้อยที่สุด ดังนั้น ลำดับความสำคัญของลำดับจากน้อยไปมากจึงถือว่าหมายเลข 4 เป็นลำดับความสำคัญสูงสุด
4 | 8 | 12 | 20 | 35 | 45 |
ใน ตารางด้านบน 4 มีลำดับความสำคัญสูงสุด และ 45 มีลำดับความสำคัญต่ำสุด
คิวลำดับความสำคัญของคำสั่งซื้อจากมากไปน้อย
คิวลำดับความสำคัญของลำดับจากมากไปน้อยจะให้ความสำคัญสูงสุดกับจำนวนสูงสุดในคิวนั้น ตัวอย่างเช่น คุณมีตัวเลขหกตัวในคิวลำดับความสำคัญที่ 4, 8, 12, 45, 35, 20 อันดับแรก คุณจะจัดเรียงตัวเลขเหล่านี้ในลำดับจากน้อยไปมาก รายการใหม่มีดังนี้ 45, 35, 20, 12, 8, 4. ในรายการนี้ 45 เป็นจำนวนสูงสุด ดังนั้น คิวลำดับความสำคัญของลำดับจากมากไปน้อยถือว่าหมายเลข 45 เป็นลำดับความสำคัญสูงสุด
45 | 35 | 20 | 12 | 8 | 4 |
ในตารางด้านบน 4 มีลำดับความสำคัญต่ำสุด และ 45 มีลำดับความสำคัญสูงสุด
การนำคิวลำดับความสำคัญไปใช้ในโครงสร้างข้อมูล
คุณสามารถใช้คิวลำดับความสำคัญด้วยวิธีใดวิธีหนึ่งต่อไปนี้:
- รายการเชื่อมโยง
- ฮีปไบนารี
- อาร์เรย์
- ต้นไม้ค้นหาไบนารี
ฮีปไบนารีเป็นวิธีที่มีประสิทธิภาพสูงสุดสำหรับการนำ ลำดับความสำคัญไปใช้ใน โครงสร้าง ข้อมูล
ตารางด้านล่างสรุปความซับซ้อนของการดำเนินการต่างๆ ในคิวที่มีลำดับความสำคัญ
การดำเนินการ | Unordered Array | อาร์เรย์ที่สั่งซื้อ | กองไบนารี | แผนผังการค้นหาไบนารี |
แทรก | 0(1) | 0(N) | 0(บันทึก(N)) | 0(บันทึก(N)) |
แอบมอง | 0(N) | 0(1) | 0(1) | 0(1) |
ลบ | 0(N) | 0(1) | 0(บันทึก (N)) | 0(บันทึก(N)) |
กองไบนารี
ไบนารีฮีปทรีจะจัดระเบียบโหนดหลักและโหนดย่อยของทรีตามลำดับเฉพาะ ในทรีไบนารีไบนารี โหนดหลักสามารถมีโหนดย่อยได้สูงสุด 2 โหนด ค่าของโหนดหลักอาจเป็น:
- เท่ากับหรือน้อยกว่าค่าของโหนดย่อย
- เท่ากับหรือมากกว่าค่าของโหนดย่อย
กระบวนการข้างต้นแบ่งไบนารีฮีปออกเป็นสองประเภท: max heap และ min-heap
Max Heap
ฮีปสูงสุดคือฮีปไบนารีที่โหนดหลักมีค่าเท่ากับหรือมากกว่าค่าโหนดย่อย โหนดรากของต้นไม้มีค่าสูงสุด
การแทรกองค์ประกอบใน Max Heap Binary Tree
คุณสามารถทำตามขั้นตอนต่อไปนี้เพื่อแทรกองค์ประกอบ/ตัวเลขใน คิวลำดับความสำคัญในโครงสร้าง ข้อมูล
- อัลกอริทึมจะสแกนต้นไม้จากบนลงล่างและจากซ้ายไปขวาเพื่อค้นหาช่องว่าง จากนั้นจะแทรกองค์ประกอบที่โหนดสุดท้ายในแผนผัง
- หลังจากแทรกองค์ประกอบแล้ว ลำดับของไบนารีทรีจะถูกรบกวน คุณต้องสลับข้อมูลระหว่างกันเพื่อจัดเรียงลำดับของต้นไม้ไบนารีฮีปสูงสุด คุณต้องสับเปลี่ยนข้อมูลต่อไปจนกว่าต้นไม้จะตรงตามคุณสมบัติ max-heap
อัลกอริธึมเพื่อแทรกองค์ประกอบใน Max Heap Binary Tree
หากต้นไม้ว่างเปล่าและไม่มีโหนด
สร้างโหนดหลักใหม่ newElement
อื่น ๆ (โหนดหลักมีอยู่แล้ว)
แทรกองค์ประกอบใหม่ที่ส่วนท้ายของทรี (เช่น โหนดสุดท้ายของทรีจากซ้ายไปขวา)
max-heapify ต้นไม้
การลบองค์ประกอบใน Max Heap Binary Tree
- คุณสามารถทำตามขั้นตอนต่อไปนี้เพื่อลบองค์ประกอบใน คิวลำดับความสำคัญในโครงสร้าง ข้อมูล
- เลือกองค์ประกอบที่คุณต้องการลบออกจากไบนารีทรี
- เลื่อนข้อมูลที่ส่วนท้ายของทรีโดยสลับกับข้อมูลโหนดสุดท้าย
- ลบองค์ประกอบสุดท้ายของไบนารีทรี
- หลังจากลบองค์ประกอบแล้ว ลำดับของไบนารีทรีจะถูกรบกวน คุณต้องเรียงลำดับเพื่อให้เป็นไปตามคุณสมบัติของ max-heap คุณต้องสับเปลี่ยนข้อมูลต่อไปจนกว่าต้นไม้จะตรงตามคุณสมบัติ max-heap
อัลกอริทึมการลบองค์ประกอบใน Max Heap Binary Tree
หาก elementUpForDeletion เป็น LastNode
ลบ elementUpForDeletion
อื่นแทนที่ elementUpForDeletion ด้วย lastNode
ลบ elementUpForDeletion
max-heapify ต้นไม้
ค้นหาองค์ประกอบสูงสุดหรือต่ำสุดในแผนภูมิไบนารีฮีปสูงสุด
ในทรีไบนารีฮีปสูงสุด การดำเนินการ find จะส่งคืนโหนดหลัก (องค์ประกอบสูงสุด) ของทรี
อัลกอริธึมเพื่อค้นหาค่าสูงสุดหรือต่ำสุดในแผนภูมิไบนารี Max Heap
ส่งคืน ParentNode
การใช้งานโปรแกรมของคิวลำดับความสำคัญโดยใช้ Max Heap Binary Tree
#include <stdio.h> int binary_tree = 10; int max_heap = 0; การทดสอบ int const = 100000;
ถือเป็นโมฆะ swap (int *x, int *y ) { int ก; ก = *x; *x= *y; *y = ก; }
//โค้ดสำหรับค้นหาพาเรนต์ใน max heap tree int findParentNode (โหนด int [], รูท int) { ถ้า ((ราก > 1) && (ราก < binary_tree)) { ส่งคืนรูท/2; } กลับ -1; }
เป็นโมฆะ max_heapify (โหนด int [], int root) { int leftNodeRoot = findLeftChild (โหนด, รูท); int rightNodeRoot = findRightChild (โหนด, รูท);
// ค้นหาสูงสุดระหว่างรูท ลูกซ้าย ลูกขวา int สูงสุด = รูท;
ถ้า ((leftNodeRoot <= max_heap) && (leftNodeRoot >0)) { ถ้า (โหนด [leftNodeRoot] > โหนด [สูงสุด]) { สูงสุด = leftNodeRoot; } }
ถ้า ((rightNodeRoot <= max_heap) && (rightNodeRoot >0)) { ถ้า (โหนด [rightNodeRoot] > โหนด [สูงสุด]) { สูงสุด = rightNodeRoot; } }
ถ้า (สูงสุด != รูท) { สลับ(&โหนด[รูท], &โหนด[สูงสุด]); max_heapify(โหนด สูงสุด); } }
เป็นโมฆะ create_max_heap (โหนด int []) { int d; สำหรับ (d=max_heap/2; d>=1; d–) { max_heapify (โหนด d); } }
int สูงสุด (โหนด int []) { โหนดกลับ[1]; }
int find_max (โหนด int []) { int maxNode = โหนด [1]; โหนด[1] = โหนด[max_heap]; max_heap–; max_heapify (โหนด 1); ส่งคืน maxNode; } เป็นโมฆะ descend_key (โหนด int [], โหนด int, คีย์ int) { A[root] = คีย์; max_heapify (โหนด, รูท); } เป็นโมฆะ added_key (โหนด int [], รูท int, คีย์ int) { โหนด [รูท] = คีย์; ในขณะที่ ((ราก> 1) && (โหนด [findParentNode (โหนด, รูท)] < โหนด [รูท])) { สลับ(&โหนด[รูท], &โหนด[findParentNode(โหนด, รูท)]); root = findParentNode(โหนด, รูท); } }
การแทรกเป็นโมฆะ (โหนด int [], คีย์ int) { max_heap++; โหนด[max_heap] = -1*ทดสอบ; เพิ่ม_key(โหนด, max_heap, คีย์); }
เป็นโมฆะ display_heap (โหนด int []) { int d; สำหรับ (d=1; d<=max_heap; d++) { printf(“%d\n”,โหนด[d]); } printf(“\n”); }
int หลัก () { โหนด int [binary_tree]; แทรก(โหนด 10); แทรก(โหนด 4); แทรก(โหนด 20); แทรก(โหนด 50); แทรก(โหนด 1); แทรก(โหนด 15);
display_heap(โหนด);
printf(“%d\n\n”, สูงสุด (โหนด)); display_heap(โหนด);
printf(“%d\n”, extract_max(โหนด)); printf(“%d\n”, extract_max(โหนด)); กลับ 0; } |
มิน ฮีป
min-heap เป็นไบนารีฮีปที่โหนดหลักมีค่าเท่ากับหรือน้อยกว่าค่าโหนดย่อย โหนดรากของต้นไม้มีค่าต่ำสุด
คุณสามารถใช้ min-heap ในลักษณะเดียวกับ max-heap ยกเว้นการย้อนกลับลำดับ
บทสรุป
ตัวอย่างที่ให้ไว้ในบทความมีจุดประสงค์เพื่ออธิบายเท่านั้น คุณสามารถแก้ไขข้อความที่ระบุข้างต้นได้ตามความต้องการของคุณ ในบล็อกนี้ เราได้เรียนรู้เกี่ยวกับแนวคิดของ ลำดับความสำคัญในโครงสร้าง ข้อมูล คุณสามารถลองใช้ตัวอย่างเพื่อเสริมสร้างความรู้ด้านโครงสร้างข้อมูลของคุณ
หากคุณอยากเรียนรู้เกี่ยวกับวิทยาศาสตร์ข้อมูล ลองดูโปรแกรม Executive PG ของ IIIT-B & upGrad ใน Data Science ซึ่งสร้างขึ้นสำหรับมืออาชีพที่ทำงานและมีกรณีศึกษาและโครงการมากกว่า 10 รายการ เวิร์กช็อปภาคปฏิบัติจริง การให้คำปรึกษากับผู้เชี่ยวชาญในอุตสาหกรรม 1 -on-1 พร้อมที่ปรึกษาในอุตสาหกรรม การเรียนรู้มากกว่า 400 ชั่วโมงและความช่วยเหลือด้านงานกับบริษัทชั้นนำ
เรียนรู้ หลักสูตรวิทยาศาสตร์ข้อมูล ออนไลน์จากมหาวิทยาลัยชั้นนำของโลก รับโปรแกรม PG สำหรับผู้บริหาร โปรแกรมประกาศนียบัตรขั้นสูง หรือโปรแกรมปริญญาโท เพื่อติดตามอาชีพของคุณอย่างรวดเร็ว
คิวลำดับความสำคัญคือคิวพิเศษที่องค์ประกอบจะถูกแทรกตามลำดับความสำคัญ คุณลักษณะนี้มีประโยชน์ในการใช้งานโครงสร้างข้อมูลอื่นๆ ต่อไปนี้คือแอปพลิเคชันยอดนิยมบางส่วนของคิวลำดับความสำคัญ: วิธีการที่ใช้ในการปรับใช้คิวลำดับความสำคัญโดยใช้อาร์เรย์นั้นง่าย โครงสร้างถูกสร้างขึ้นเพื่อเก็บค่าและลำดับความสำคัญขององค์ประกอบ จากนั้นอาร์เรย์ของโครงสร้างนั้นจะถูกสร้างขึ้นเพื่อจัดเก็บองค์ประกอบ การดำเนินการต่อไปนี้เกี่ยวข้องกับการใช้งานนี้: ต่อไปนี้แสดงให้เห็นถึงความแตกต่างระหว่างฮีปสูงสุดและฮีปขั้นต่ำแอพพลิเคชั่นของ Priority Queue คืออะไร?
1. อัลกอริธึมเส้นทางที่สั้นที่สุดของ Dijkstra: คิวลำดับความสำคัญสามารถใช้ในอัลกอริธึมเส้นทางที่สั้นที่สุดของ Dijkstra เมื่อกราฟถูกจัดเก็บในรูปแบบของรายการที่อยู่ติดกัน
2. อัลกอริธึมของ Prim : อัลกอริธึมของ Prim ใช้ลำดับความสำคัญของคิวกับค่าหรือคีย์ของโหนด และดึงค่าต่ำสุดเหล่านี้ออกในทุกขั้นตอน
การบีบอัดข้อมูล : รหัส Huffman ใช้ลำดับความสำคัญในการบีบอัดข้อมูล
ระบบปฏิบัติการ: คิวลำดับความสำคัญมีประโยชน์อย่างมากสำหรับระบบปฏิบัติการในกระบวนการต่างๆ เช่น การทำโหลดบาลานซ์และการจัดการการหยุดชะงัก แนวทางใดที่ใช้ในการนำลำดับความสำคัญไปใช้โดยใช้อาร์เรย์
1. enqueue() - ฟังก์ชั่นนี้แทรกองค์ประกอบที่ส่วนท้ายของคิว
2. peek() - ฟังก์ชั่นนี้จะสำรวจอาร์เรย์เพื่อส่งคืนองค์ประกอบที่มีลำดับความสำคัญสูงสุด หากพบองค์ประกอบสองรายการที่มีลำดับความสำคัญเท่ากัน ก็จะส่งกลับองค์ประกอบที่มีมูลค่าสูงสุดในบรรดาองค์ประกอบเหล่านั้น
3. dequeue() - ฟังก์ชั่นนี้จะเปลี่ยนองค์ประกอบทั้งหมด 1 ตำแหน่งทางด้านซ้ายขององค์ประกอบที่ส่งคืนโดยฟังก์ชัน peek() และลดขนาด ฮีปสูงสุดและฮีปขั้นต่ำแตกต่างกันอย่างไร
Min Heap - ใน min-heap คีย์ของรูทโหนดต้องน้อยกว่าหรือเท่ากับคีย์ของโหนดชายน์ มันใช้ลำดับความสำคัญจากน้อยไปมาก โหนดที่มีคีย์ที่เล็กที่สุดคือลำดับความสำคัญ องค์ประกอบที่เล็กที่สุดจะปรากฏก่อนองค์ประกอบอื่น
Max Heap - ในฮีปสูงสุด คีย์ของรูทโหนดต้องมากกว่าหรือเท่ากับคีย์ของโหนดย่อย ใช้ลำดับความสำคัญจากมากไปหาน้อย โหนดที่มีคีย์ที่ใหญ่ที่สุดคือลำดับความสำคัญ องค์ประกอบที่ใหญ่ที่สุดจะปรากฏก่อนองค์ประกอบอื่น