ฉันต้องการใช้ฮีปเมื่อใด


93

นอกเหนือจากคำตอบที่ชัดเจนของ Priority Queue ฮีปจะมีประโยชน์ในการผจญภัยในการเขียนโปรแกรมของฉันเมื่อใด


8
มีคำตอบดีๆมากมายที่นี่ดังนั้นฉันจะพูดว่า "เมื่อกองยังไม่ใหญ่พอ"
Don Werve

คำตอบ:


122

ใช้เมื่อใดก็ตามที่คุณต้องการเข้าถึงรายการที่ใหญ่ที่สุด (หรือเล็กที่สุด) อย่างรวดเร็วเนื่องจากรายการนั้นจะเป็นองค์ประกอบแรกในอาร์เรย์หรือที่รากของต้นไม้เสมอ

อย่างไรก็ตามส่วนที่เหลือของอาร์เรย์จะถูกเก็บไว้บางส่วนโดยไม่เรียงลำดับ ดังนั้นการเข้าถึงแบบทันทีจึงทำได้เฉพาะกับรายการที่ใหญ่ที่สุด (เล็กที่สุด) เท่านั้น การแทรกนั้นรวดเร็วดังนั้นจึงเป็นวิธีที่ดีในการจัดการกับเหตุการณ์หรือข้อมูลที่เข้ามาและสามารถเข้าถึงข้อมูลที่เร็วที่สุด / ใหญ่ที่สุดได้เสมอ

มีประโยชน์สำหรับคิวลำดับความสำคัญตัวกำหนดตารางเวลา (ที่ต้องการรายการแรกสุด) ฯลฯ ...

ฮีปคือทรีที่ค่าของโหนดพาเรนต์มีขนาดใหญ่กว่าโหนดที่สืบทอดมา

หากคุณคิดว่าฮีปเป็นต้นไม้ไบนารีที่จัดเก็บในลำดับเชิงเส้นตามความลึกโดยให้โหนดรูทก่อน (จากนั้นลูกของโหนดนั้นถัดจากนั้นลูกของโหนดเหล่านั้นถัดไป) จากนั้นลูกของโหนดที่ดัชนี N อยู่ที่ 2N + 1 และ 2N + 2 คุณสมบัตินี้ช่วยให้เข้าถึงได้อย่างรวดเร็วโดยดัชนี และเนื่องจากฮีปถูกจัดการโดยการสลับโหนดจึงทำให้สามารถจัดเรียงแบบแทนที่ได้


3
โปรดทราบว่าอาจเป็นการจัดเรียง NlogN ที่รับประกันความสะดวกซึ่งไม่ต้องการการจัดสรรอาร์เรย์เพิ่มเติม
ล้น

38
นอกจากนี้ยังเป็นเรื่องที่ดีที่ได้ทราบจำนวนมากสำหรับคำถามสัมภาษณ์)
vivekian2

21
@ vivekian2 เหตุผลเดียวที่ฉันมาที่นี่ก็เพราะว่าฉันกำลังจะสัมภาษณ์
byxor

ทำไมไม่ใช้สแต็กคลาสกับสแต็กเสริมเพื่อติดตามรายการที่ใหญ่ที่สุด (หรือเล็กที่สุด) การดึงข้อมูลคือ O (1)
Ridhwaan Shakeel

@RidhwaanShakeel หากคุณใช้สแต็คไอเท็มของคุณจะถูกวางไว้บนศีรษะเสมอจะเกิดอะไรขึ้นหากตำแหน่งของไอเท็มจะต้องพิจารณาจากคุณสมบัติบางอย่างของไอเท็มเช่นเหตุการณ์ที่ใหญ่ที่สุด (ขึ้นอยู่กับจำนวนคนที่เข้าร่วมในกิจกรรม)
SandeepGodara

50

ฮีปเป็นโครงสร้างที่ช่วยให้สามารถเข้าถึงค่าต่ำสุดหรือสูงสุดได้อย่างรวดเร็ว

แต่ทำไมคุณถึงต้องการเช่นนั้น? คุณสามารถตรวจสอบทุกรายการที่เพิ่มเพื่อดูว่ารายการเล็กที่สุดหรือใหญ่ที่สุด 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 องค์ประกอบมากกว่าอีกชิ้นหนึ่ง) คุณดึงองค์ประกอบจากฮีปที่ใหญ่ที่สุดและเพิ่มให้น้อยที่สุด ตอนนี้สมดุลแล้ว


6
ตัวอย่างซับซ้อนยิ่งน่าทึ่ง! ฉันจะลองดูสักครั้ง อย่างไรก็ตามฉันคิดว่ามีข้อผิดพลาดเล็กน้อยในตัวอย่างของคุณ เนื่องจากเราต้องหาค่ามัธยฐานโดยการหาค่าเฉลี่ยของสององค์ประกอบที่อยู่ตรงกลาง ฉันคิดว่าเราจำเป็นต้องใช้ฮีปขั้นต่ำเพื่อเก็บตัวเลขที่ใหญ่กว่าค่ามัธยฐานปัจจุบันและฮีปสูงสุดเพื่อเก็บตัวเลขที่เล็กกว่าค่ามัธยฐานปัจจุบัน ด้วยวิธีนี้เราสามารถแยกองค์ประกอบทั้งสองตรงกลางในเวลาคงที่และคำนวณค่ามัธยฐานได้หรือไม่? ฉันถูกไหม?
Calvin Ku

12

ลักษณะของฮีปคือเป็นโครงสร้างที่เก็บข้อมูลไว้กึ่งลำดับ ดังนั้นจึงเป็นการแลกเปลี่ยนที่ดีระหว่างค่าใช้จ่ายในการรักษาคำสั่งซื้อที่สมบูรณ์และค่าใช้จ่ายในการค้นหาผ่านความสับสนวุ่นวายแบบสุ่ม ลักษณะดังกล่าวใช้กับอัลกอริทึมหลายอย่างเช่นการเลือกการสั่งซื้อหรือการจัดประเภท

ลักษณะที่มีประโยชน์อีกอย่างของฮีปคือสามารถสร้างขึ้นในตำแหน่งจากอาร์เรย์!


3

ยังเหมาะสำหรับอัลกอริทึมการเลือก (ค้นหาค่าต่ำสุดหรือสูงสุด)



0

คุณสามารถใช้ minHeap หรือ maxHeap เมื่อคุณต้องการเข้าถึงองค์ประกอบที่เล็กที่สุดและใหญ่ที่สุดตามลำดับ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.