นอกเหนือจากคำตอบที่ชัดเจนของ Priority Queue ฮีปจะมีประโยชน์ในการผจญภัยในการเขียนโปรแกรมของฉันเมื่อใด
นอกเหนือจากคำตอบที่ชัดเจนของ Priority Queue ฮีปจะมีประโยชน์ในการผจญภัยในการเขียนโปรแกรมของฉันเมื่อใด
คำตอบ:
ใช้เมื่อใดก็ตามที่คุณต้องการเข้าถึงรายการที่ใหญ่ที่สุด (หรือเล็กที่สุด) อย่างรวดเร็วเนื่องจากรายการนั้นจะเป็นองค์ประกอบแรกในอาร์เรย์หรือที่รากของต้นไม้เสมอ
อย่างไรก็ตามส่วนที่เหลือของอาร์เรย์จะถูกเก็บไว้บางส่วนโดยไม่เรียงลำดับ ดังนั้นการเข้าถึงแบบทันทีจึงทำได้เฉพาะกับรายการที่ใหญ่ที่สุด (เล็กที่สุด) เท่านั้น การแทรกนั้นรวดเร็วดังนั้นจึงเป็นวิธีที่ดีในการจัดการกับเหตุการณ์หรือข้อมูลที่เข้ามาและสามารถเข้าถึงข้อมูลที่เร็วที่สุด / ใหญ่ที่สุดได้เสมอ
มีประโยชน์สำหรับคิวลำดับความสำคัญตัวกำหนดตารางเวลา (ที่ต้องการรายการแรกสุด) ฯลฯ ...
ฮีปคือทรีที่ค่าของโหนดพาเรนต์มีขนาดใหญ่กว่าโหนดที่สืบทอดมา
หากคุณคิดว่าฮีปเป็นต้นไม้ไบนารีที่จัดเก็บในลำดับเชิงเส้นตามความลึกโดยให้โหนดรูทก่อน (จากนั้นลูกของโหนดนั้นถัดจากนั้นลูกของโหนดเหล่านั้นถัดไป) จากนั้นลูกของโหนดที่ดัชนี N อยู่ที่ 2N + 1 และ 2N + 2 คุณสมบัตินี้ช่วยให้เข้าถึงได้อย่างรวดเร็วโดยดัชนี และเนื่องจากฮีปถูกจัดการโดยการสลับโหนดจึงทำให้สามารถจัดเรียงแบบแทนที่ได้
ฮีปเป็นโครงสร้างที่ช่วยให้สามารถเข้าถึงค่าต่ำสุดหรือสูงสุดได้อย่างรวดเร็ว
แต่ทำไมคุณถึงต้องการเช่นนั้น? คุณสามารถตรวจสอบทุกรายการที่เพิ่มเพื่อดูว่ารายการเล็กที่สุดหรือใหญ่ที่สุด O(1)
วิธีนี้คุณมักจะมีขนาดเล็กที่สุดหรือที่ใหญ่ที่สุดในเวลาคง
คำตอบคือเพราะกองช่วยให้คุณสามารถที่จะดึงที่มีขนาดเล็กหรือใหญ่ที่สุดได้อย่างรวดเร็วและทราบต่อไปมีขนาดเล็กที่สุดหรือที่ใหญ่ที่สุด นั่นเป็นเหตุผลที่เรียกว่า Priority Queue
สมมติว่าคุณมีโรงพยาบาลที่มีผู้ป่วยเข้ารับการรักษาตามอายุ ผู้ที่มีอายุมากที่สุดจะเข้าร่วมก่อนเสมอไม่ว่าจะเข้าคิวเมื่อใดก็ตาม
คุณไม่สามารถติดตามคนที่เก่าแก่ที่สุดได้เพราะถ้าคุณดึงเขา / เธอออกคุณจะไม่รู้ว่าคนที่เก่าแก่ที่สุดคนต่อไป เพื่อที่จะแก้ปัญหาที่เกิดขึ้นในโรงพยาบาลนี้คุณใช้กองสูงสุด ฮีปนี้ตามคำจำกัดความเรียงลำดับบางส่วน ซึ่งหมายความว่าคุณไม่สามารถเรียงลำดับผู้ป่วยตามอายุของพวกเขา แต่คุณรู้ไหมว่าคนที่เก่าแก่ที่สุดอยู่เสมอในด้านบนเพื่อให้คุณสามารถดึงผู้ป่วยออกมาในเวลาคงO(1)
และ RE-balance O(log N)
กองในเวลาที่บันทึก
สมมติว่าคุณมีลำดับของจำนวนเต็มและคุณต้องการติดตามmedian
. ค่ามัธยฐานคือตัวเลขที่อยู่ตรงกลางของอาร์เรย์ที่เรียงลำดับ
ตัวอย่าง:
[1, 2, 5, 7, 23, 27, 31]
ในกรณีดังกล่าวข้างต้น7
เป็นค่ามัธยฐานเพราะอาร์เรย์ที่มีขนาดเล็กจำนวนมากเป็นของที่มีขนาดเดียวกันของหนึ่งที่มีตัวเลขที่ใหญ่กว่า[1, 2, 5]
[23, 27, 31]
โดยปกติถ้าอาร์เรย์มีเลขคี่ขององค์ประกอบแบ่งเป็นค่าเฉลี่ยเลขคณิตของ 2 (5 + 7)/2
องค์ประกอบในกลางเช่น
ตอนนี้คุณติดตามค่ามัธยฐานอย่างไร ด้วยการมี 2ฮีปหนึ่งฮีปขั้นต่ำที่มีตัวเลขที่เล็กกว่าค่ามัธยฐานปัจจุบันและฮีปสูงสุดที่มีตัวเลขที่ใหญ่กว่าค่ามัธยฐานปัจจุบัน ตอนนี้ถ้าฮีปเหล่านี้สมดุลกันเสมอ 2 ฮีปจะมีจำนวนองค์ประกอบเท่ากันหรือหนึ่งจะมี 1 องค์ประกอบมากกว่าอีกส่วนมากที่สุด
เมื่อคุณเพิ่มองค์ประกอบใหม่ลงในลำดับหากจำนวนน้อยกว่าค่ามัธยฐานปัจจุบันคุณจะเพิ่มลงในฮีปขั้นต่ำมิฉะนั้นคุณจะเพิ่มลงในฮีปสูงสุด ตอนนี้ถ้าฮีปไม่สมดุล (ฮีปหนึ่งมีมากกว่า 1 องค์ประกอบมากกว่าอีกชิ้นหนึ่ง) คุณดึงองค์ประกอบจากฮีปที่ใหญ่ที่สุดและเพิ่มให้น้อยที่สุด ตอนนี้สมดุลแล้ว
ลักษณะของฮีปคือเป็นโครงสร้างที่เก็บข้อมูลไว้กึ่งลำดับ ดังนั้นจึงเป็นการแลกเปลี่ยนที่ดีระหว่างค่าใช้จ่ายในการรักษาคำสั่งซื้อที่สมบูรณ์และค่าใช้จ่ายในการค้นหาผ่านความสับสนวุ่นวายแบบสุ่ม ลักษณะดังกล่าวใช้กับอัลกอริทึมหลายอย่างเช่นการเลือกการสั่งซื้อหรือการจัดประเภท
ลักษณะที่มีประโยชน์อีกอย่างของฮีปคือสามารถสร้างขึ้นในตำแหน่งจากอาร์เรย์!
ยังเหมาะสำหรับอัลกอริทึมการเลือก (ค้นหาค่าต่ำสุดหรือสูงสุด)
เมื่อคุณจัดเรียงรายการชั่วคราวคุณควรพิจารณา heaps
คุณสามารถใช้ minHeap หรือ maxHeap เมื่อคุณต้องการเข้าถึงองค์ประกอบที่เล็กที่สุดและใหญ่ที่สุดตามลำดับ