เหตุใดฮีปแบบรันไทม์จึงใช้สำหรับการจัดสรรหน่วยความจำแบบไดนามิกในภาษา C และโครงสร้างข้อมูลซึ่งทั้งสองเรียกว่า "ฮีป" มีความสัมพันธ์บ้างไหม?
เหตุใดฮีปแบบรันไทม์จึงใช้สำหรับการจัดสรรหน่วยความจำแบบไดนามิกในภาษา C และโครงสร้างข้อมูลซึ่งทั้งสองเรียกว่า "ฮีป" มีความสัมพันธ์บ้างไหม?
คำตอบ:
Donald Knuth พูดว่า (ศิลปะแห่งการเขียนโปรแกรมคอมพิวเตอร์, Third Ed., Vol. 1, p. 435):
ผู้เขียนหลายคนเริ่มประมาณปี 1975 เพื่อเรียกกองหน่วยความจำที่มีอยู่ว่า "กอง"
เขาไม่ได้พูดว่าผู้เขียนคนใดและไม่ได้อ้างถึงเอกสารเฉพาะใด ๆ แต่พูดว่าการใช้คำว่า "heap" ในความสัมพันธ์กับคิวที่มีลำดับความสำคัญเป็นความรู้สึกดั้งเดิมของคำ
พวกเขามีชื่อเดียวกัน แต่จริงๆแล้วมันไม่เหมือนกัน (แม้จะเป็นแนวคิด) ฮีปหน่วยความจำเรียกว่าฮีปในลักษณะเดียวกับที่คุณจะอ้างถึงตะกร้าซักผ้าเป็น "กองเสื้อผ้า" ชื่อนี้ใช้เพื่อระบุสถานที่ที่ค่อนข้างยุ่งซึ่งสามารถจัดสรรและจัดสรรหน่วยความจำได้ตามต้องการ โครงสร้างข้อมูล (ตามลิงค์ของ Wikipedia ที่คุณอ้างถึง) นั้นแตกต่างกันมาก
การชนกันของชื่อนั้นเป็นเรื่องที่โชคร้าย แต่ไม่ใช่ทั้งหมดที่ลึกลับ ฮีปเป็นคำทั่วไปขนาดเล็กที่ใช้หมายถึงกองการรวบรวมกลุ่ม ฯลฯ การใช้คำสำหรับโครงสร้างข้อมูลก่อนวันที่ (ฉันค่อนข้างแน่ใจ) ชื่อของพูลหน่วยความจำ ในความเป็นจริงสระว่ายน้ำน่าจะเป็นทางเลือกที่ดีกว่าสำหรับคนหลัง ๆ ในความคิดของฉัน ฮีพมีโครงสร้างแบบแนวตั้ง (เช่นกอง) ซึ่งเหมาะกับโครงสร้างข้อมูล แต่ไม่ใช่พูลหน่วยความจำ เราไม่คิดว่าฮีปพูลหน่วยความจำเป็นลำดับชั้นในขณะที่แนวคิดพื้นฐานที่อยู่เบื้องหลังโครงสร้างข้อมูลคือการรักษาองค์ประกอบที่ใหญ่ที่สุดที่ด้านบนสุดของฮีป (และฮีปย่อย)
กองข้อมูลโครงสร้างวันที่กลับไปกลางทศวรรษที่ 60; กองพูหน่วยความจำต้นปี 70 คำว่า heap (หมายถึงพูลหน่วยความจำ) ถูกใช้อย่างน้อยต้นปี 1971 โดยWijngaardenในการสนทนาของ Algol
อาจเป็นไปได้ว่าการใช้ฮีปครั้งแรกสุดในโครงสร้างข้อมูลนั้นถูกค้นพบเมื่อเจ็ดปีก่อนใน
วิลเลียมส์ JWJ 1964 "อัลกอริทึม 232 - ฮีปพอร์ต" การสื่อสารของ ACM 7 (6): 347-348
ที่จริงแล้วการอ่านเกี่ยวกับวิธีการจัดสรรหน่วยความจำ (ดูBuddy Blocks ) ทำให้ฉันนึกถึงกองในโครงสร้างข้อมูล
IMO เป็นเพียงอุบัติเหตุ / ความบังเอิญว่าสิ่งที่ไม่เกี่ยวข้องกันทั้งสองนี้มีชื่อเหมือนกัน เช่นใช้กราฟและกราฟ
อัลกอริธึมในการค้นหาการจัดสรรหน่วยความจำที่มีอยู่ใช้โครงสร้างข้อมูลคล้ายฮีป ต่อไปนี้คัดลอกมาจากhttp://www.cprogramming.com/tutorial/virtual_memory_and_heaps.html
เมื่อ
new
มีการเรียกใช้มันจะเริ่มค้นหาบล็อกหน่วยความจำฟรีที่เหมาะกับขนาดสำหรับคำขอของคุณ หากว่าพบบล็อกหน่วยความจำเช่นนั้นจะถูกทำเครื่องหมายเป็นสงวนและตัวชี้ไปยังตำแหน่งนั้นจะถูกส่งกลับ มีอัลกอริธึมหลายอย่างที่จะทำสิ่งนี้ได้เพราะการประนีประนอมระหว่างการสแกนหน่วยความจำทั้งหมดเพื่อค้นหาบล็อกว่างที่เล็กที่สุดที่ใหญ่กว่าขนาดของวัตถุของคุณหรือคืนค่าแรกที่หน่วยความจำต้องการ เพื่อปรับปรุงความเร็วในการรับบล็อกของหน่วยความจำพื้นที่ว่างและหน่วยความจำที่สงวนไว้จะถูกเก็บไว้ในโครงสร้างข้อมูลคล้ายกับต้นไม้ไบนารีที่เรียกว่าฮีป
หน่วยความจำสแตกคำศัพท์และหน่วยความจำฮีปไม่ได้ใช้ในมาตรฐาน C ++ มาตรฐานใช้การจัดเก็บแบบคงที่การจัดเก็บด้ายจัดเก็บอัตโนมัติและการจัดเก็บแบบไดนามิก
ดูเพิ่มเติมได้ที่ส่วนความทนทานต่อการจัดเก็บของมาตรฐาน
ดังนั้นจากภาษาและมุมมองไลบรารีมาตรฐานจึงไม่มีความสับสน
Q. กองคืออะไร? A. heap คือชุดของวัตถุที่วางซ้อนทับกัน
ตอบคำถามของคุณ: ฮีปหน่วยความจำและฮีปไบนารีใช้แนวคิดเดียวกันกับที่คุณรู้ ข้อมูลถูกจัดเก็บในรูปแบบของฮีปในหน่วยความจำในลำดับเดียวกับที่เขียนในโปรแกรมในขณะที่ไบนารีฮีปเป็นโครงสร้างข้อมูลที่เป็นไปตามแนวคิดเดียวกันของการจัดเก็บข้อมูลในรูปแบบของคำสั่งในรูปแบบของฮีป (Data on top) ของอื่น ๆ ) แจ้งให้เราทราบว่าคุณคิดอย่างไรในส่วนความเห็น
บางทีหน่วยความจำฮีปแรกที่นำไปใช้นั้นได้รับการจัดการโดยโครงสร้างฮีป