กองยังเป็นที่รู้จักลำดับความสำคัญคิวเป็นชนิดข้อมูลนามธรรม โดยหลักการแล้วมันเป็นต้นไม้ไบนารีที่ลูกของทุกโหนดมีขนาดเล็กกว่าหรือเท่ากับโหนดเอง (สมมติว่าเป็น max-heap.) เมื่อองค์ประกอบถูกผลักหรือผุด heap จะจัดเรียงตัวเองใหม่ดังนั้นองค์ประกอบที่ใหญ่ที่สุดคือถัดไปที่จะถูกตอก มันสามารถนำมาใช้เป็นต้นไม้หรือเป็นอาร์เรย์ได้อย่างง่ายดาย
ความท้าทายของคุณถ้าคุณเลือกที่จะยอมรับมันคือการพิจารณาว่าอาร์เรย์เป็นฮีปที่ถูกต้องหรือไม่ อาเรย์อยู่ในรูปแบบฮีปถ้าลูกทุกองค์ประกอบมีขนาดเล็กกว่าหรือเท่ากับองค์ประกอบนั้น ใช้อาร์เรย์ต่อไปนี้เป็นตัวอย่าง:
[90, 15, 10, 7, 12, 2]
จริงๆนี่คือต้นไม้ไบนารีที่จัดเรียงในรูปแบบของอาร์เรย์ นี่เป็นเพราะทุกองค์ประกอบมีลูก 90 มีลูกสองคน 15 และ 10
15, 10,
[(90), 7, 12, 2]
15 มีเด็ก 7 และ 12:
7, 12,
[90, (15), 10, 2]
10 มีลูก:
2
[90, 15, (10), 7, 12, ]
และองค์ประกอบต่อไปก็จะเป็นลูกของ 10 ยกเว้นว่าไม่มีที่ว่าง 7, 12 และ 2 ทุกคนจะมีลูกด้วยเช่นกันถ้าอาเรย์นั้นยาวพอ นี่เป็นอีกตัวอย่างหนึ่งของกอง:
[16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
และนี่คือการสร้างภาพต้นไม้ที่อาร์เรย์ก่อนหน้าสร้างขึ้น:
ในกรณีที่มันไม่ชัดเจนพอนี่คือสูตรที่ชัดเจนเพื่อให้เด็ก ๆ ขององค์ประกอบที่ฉัน
//0-indexing:
child1 = (i * 2) + 1
child2 = (i * 2) + 2
//1-indexing:
child1 = (i * 2)
child2 = (i * 2) + 1
คุณต้องใช้อาร์เรย์ที่ไม่ว่างเปล่าเป็นอินพุตและเอาต์พุตค่าจริงถ้าอาร์เรย์อยู่ในลำดับฮีพและค่าเท็จเป็นอย่างอื่น นี่อาจเป็นฮีป 0 ดัชนีหรือฮีป 1 ดัชนีตราบใดที่คุณระบุรูปแบบที่โปรแกรม / ฟังก์ชันของคุณคาดหวัง คุณอาจสมมติว่าอาร์เรย์ทั้งหมดจะมีจำนวนเต็มบวกเท่านั้น คุณไม่สามารถใช้ฮีปบิวอิน ซึ่งรวมถึง แต่ไม่ จำกัด เพียง
- ฟังก์ชันที่พิจารณาว่าอาร์เรย์อยู่ในรูปแบบฮีปหรือไม่
- ฟังก์ชันที่แปลงอาร์เรย์เป็นฮีปหรือเป็นฮีป - แบบฟอร์ม
- ฟังก์ชันที่รับอาร์เรย์เป็นอินพุตและส่งคืนโครงสร้างข้อมูลฮีพ
คุณสามารถใช้สคริปต์ python นี้เพื่อตรวจสอบว่าอาร์เรย์อยู่ในรูปแบบฮีปหรือไม่ (ดัชนี 0):
def is_heap(l):
for head in range(0, len(l)):
c1, c2 = head * 2 + 1, head * 2 + 2
if c1 < len(l) and l[head] < l[c1]:
return False
if c2 < len(l) and l[head] < l[c2]:
return False
return True
ทดสอบ IO:
อินพุตทั้งหมดเหล่านี้ควรส่งคืน True:
[90, 15, 10, 7, 12, 2]
[93, 15, 87, 7, 15, 5]
[16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
[100, 19, 36, 17, 3, 25, 1, 2, 7]
[5, 5, 5, 5, 5, 5, 5, 5]
และอินพุตเหล่านี้ทั้งหมดควรส่งคืนค่าเท็จ:
[4, 5, 5, 5, 5, 5, 5, 5]
[90, 15, 10, 7, 12, 11]
[1, 2, 3, 4, 5]
[4, 8, 15, 16, 23, 42]
[2, 1, 3]
ตามปกตินี่คือ code-golf ดังนั้นช่องโหว่มาตรฐานจึงนำมาใช้และคำตอบที่สั้นที่สุดในการชนะไบต์!
[3, 2, 1, 1]
?