เหตุใดแนวคิดทั้งสองแตกต่างกันจึงเรียกว่า "ฮีป"


170

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


4
ฉันสงสัยในวันนี้ขณะที่ศึกษาโครงสร้างข้อมูล
MitMaro


3
ไปที่พจนานุกรมภาษาอังกฤษและนับจำนวนรายการภายใต้ "เรียกใช้" มีรายการมากกว่า 40 รายการที่ใช้กับคอมพิวเตอร์ :)
jmucchiello


โพสต์ที่เกี่ยวข้องที่นี่ wrt runtime heap ใช้สำหรับการจัดสรรหน่วยความจำแบบไดนามิก
RBT

คำตอบ:


77

Donald Knuth พูดว่า (ศิลปะแห่งการเขียนโปรแกรมคอมพิวเตอร์, Third Ed., Vol. 1, p. 435):

ผู้เขียนหลายคนเริ่มประมาณปี 1975 เพื่อเรียกกองหน่วยความจำที่มีอยู่ว่า "กอง"

เขาไม่ได้พูดว่าผู้เขียนคนใดและไม่ได้อ้างถึงเอกสารเฉพาะใด ๆ แต่พูดว่าการใช้คำว่า "heap" ในความสัมพันธ์กับคิวที่มีลำดับความสำคัญเป็นความรู้สึกดั้งเดิมของคำ


11
สระว่ายน้ำจะเป็นชื่อที่ดีกว่ากอง

7
น่าสนใจ ใครบางคนควรถามเขาว่าเขาจำได้ว่าผู้เขียนคนไหน
ศ. Falken

27
วิกิพีเดียอ้างว่าเป็นเพราะในช่วงแรก Lisp ใช้ heap (โครงสร้างข้อมูล) เพื่อนำหน่วยความจำมาใช้ ไม่ได้พูดว่าอย่างไร การอ้างอิงของมันคือ "Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest (1990): ความรู้เบื้องต้นเกี่ยวกับอัลกอริทึม MIT Press / McGraw-Hill" ซึ่งฉันไม่มี
Steve Jessop

2
ฉันไม่มีการอ้างอิงสำหรับเรื่องนี้ แต่ฉันเดาว่าในตอนแรกโครงสร้างข้อมูลที่ใช้ในการจัดระเบียบการอ้างอิงไปยังบล็อกหน่วยความจำที่เปิดอยู่นั้นมีค่าน้อยมาก ดูเหมือนว่าอย่างน้อยก็เป็นวิธีที่ดีในการค้นหาบล็อกหน่วยความจำขนาดเล็กที่สุดอย่างรวดเร็วซึ่งจะช่วยให้คุณเก็บข้อมูลที่คุณพยายามจะจัดเก็บอัปเดต: สิ่งที่ฉันพูดดูเหมือนฟังบัดดี้บล็อกen.wikipedia.org/wiki/Dynamic_memory_allocation # Buddy% 5Fblocks
Will

4
@SteveJessop - การตรวจสอบ Cormen, Leiserson, Rivest, Stein - ฉบับที่ 3 (2009) ในตอนต้นของบท Heapsort เพียงกล่าวว่า 'คำว่า "heap" เป็นคำประกาศเกียรติคุณในบริบทของ heapsort แต่ตั้งแต่นั้นมามีการอ้างถึง " พื้นที่เก็บข้อมูลที่เก็บขยะ "เช่นภาษาโปรแกรม Java และ Lisp ให้บริการ โครงสร้างข้อมูลฮีปของเราไม่ใช่ที่เก็บข้อมูลขยะและเมื่อใดก็ตามที่เราอ้างถึงฮีปในหนังสือเล่มนี้เราจะหมายถึงโครงสร้างข้อมูลมากกว่าแง่มุมของการเก็บขยะ ' CLRS - รุ่นที่ 2 ยังมีวลีที่เหมือนกันเกือบจะแน่นอน (ไม่มีข้อบ่งชี้ว่า Lisp ใช้ Heap)
dr jimbob

64

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


8
ใช่ฉันคิดว่านั่นเป็นประเด็นที่เขาใช้ตั้งคำถาม: มันแตกต่างกัน เหตุใดพวกเขาจึงเรียกสิ่งเดียวกัน - มีความสัมพันธ์พื้นฐานบ้าง
Sean Owen

9
วิธีที่ฉันตีความคำตอบนี้คือ "ไม่ไม่มีความสัมพันธ์พื้นฐาน" ดังนั้นมันจึงตอบคำถาม
Laurence Gonsalves

แอนดรูว์กำลังตอบคำถามนั้น ไม่มีความสัมพันธ์ เป็นเรื่องบังเอิญ ฮีปหน่วยความจำมีความจริงมากกว่าการใช้งานทั่วไปเนื่องจากหน่วยความจำถูกจัดสรรราวกับว่า โครงสร้างข้อมูลนั้นต้องการจินตนาการที่กว้างขึ้น และสิ่งนี้กลายเป็น "ทำไม" ที่น่าสนใจมากกว่า ชื่อมาจากโหนดข้อเท็จจริงที่ถูกจัดเรียงโดยคีย์ของพวกเขาและคีย์โหนดหลักคือ> = เสมอกว่าโหนดลูก
Alexandre Bell

6
พวกเขาไม่เกี่ยวข้องแน่นอน อย่างไรก็ตามปัญหาในการเรียกมันว่า "ฮีป" ก็คือ "ฮีปของ" คู่ - "สแต็ก" - ยังเป็นสแต็กจริง
แดน

1
ฉันรู้ว่าทำไมโครงสร้างข้อมูลฮีปเรียกว่าฮีป: เพราะมันสอดคล้องกับคุณสมบัติฮีป แต่ทำไมคุณสมบัติฮีพเรียกเช่นนี้? มันไม่สมเหตุสมผลสำหรับฉันเพราะชื่ออย่าง "หนักที่สุด" จะดีกว่ามาก
Thomas Eding

31

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

กองข้อมูลโครงสร้างวันที่กลับไปกลางทศวรรษที่ 60; กองพูหน่วยความจำต้นปี 70 คำว่า heap (หมายถึงพูลหน่วยความจำ) ถูกใช้อย่างน้อยต้นปี 1971 โดยWijngaardenในการสนทนาของ Algol

อาจเป็นไปได้ว่าการใช้ฮีปครั้งแรกสุดในโครงสร้างข้อมูลนั้นถูกค้นพบเมื่อเจ็ดปีก่อนใน
วิลเลียมส์ JWJ 1964 "อัลกอริทึม 232 - ฮีปพอร์ต" การสื่อสารของ ACM 7 (6): 347-348


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

มันมักจะถูกนำเสนอในฐานะตรงกันข้ามกับสแต็คซึ่งน่าจะพอเพียงเพื่ออธิบายชื่อ IMO
reinierpost

1
ไม่ใช่เรื่องบังเอิญ - รายการฟรีสามารถใช้เป็นคิวลำดับความสำคัญผ่านฮีปทวินาม
Heath Hunnicutt

2
@jmucchiello: บันทึกจำนวนมาก (ดูรูป ) มีการจัดเรียงที่ดีและมีลักษณะคล้ายต้นไม้ นี่คือที่มาของชื่อโครงสร้างข้อมูลตามหนึ่งในตำราเรียนระดับปริญญาตรีของฉัน
gioele

6

ที่จริงแล้วการอ่านเกี่ยวกับวิธีการจัดสรรหน่วยความจำ (ดูBuddy Blocks ) ทำให้ฉันนึกถึงกองในโครงสร้างข้อมูล


ความคิดเห็นของฉันเกี่ยวกับคำตอบของ Peter Zhang ก็มีความเกี่ยวข้องเช่นกัน ระบบเพื่อนคู่หูสามารถแสดงเป็นต้นไม้ไบนารีและมันก็ดูเหมือนว่า max heap ที่ถูกต้องทำเมื่อ "คีย์" ของแต่ละโหนดคือหน่วยความจำทั้งหมดที่อยู่ด้านล่าง (แต่ค่าเหล่านี้มีความหมายและไม่เคยเปลี่ยนแปลง) ทั้งการจัดสรรและอัลกอริทึมการปลดปล่อยไม่ใช้การดำเนินการฮีปบนต้นไม้ไบนารีนี้เท่าที่ฉันสามารถบอกได้
Eric Dubé

5

IMO เป็นเพียงอุบัติเหตุ / ความบังเอิญว่าสิ่งที่ไม่เกี่ยวข้องกันทั้งสองนี้มีชื่อเหมือนกัน เช่นใช้กราฟและกราฟ


ทั้งสองกราฟสามารถเกี่ยวข้องกันได้ ลองนึกภาพกราฟของฟังก์ชันดังนี้โดเมน tuple, range) เป็นจุดสุดยอดและขอบเชื่อมต่อสองจุดยอดดังกล่าว

2
@Amit: สำหรับกราฟต่อเนื่องที่หมายถึงจำนวนจุดยอดไม่สิ้นสุด มันก็โอเค แต่นั่นก็ทำให้แนวคิดของขอบระหว่างจุดยอดไม่มีความหมาย ในกราฟของฟังก์ชัน f (x) = x * 2 มีขอบระหว่าง (0,0) และ (1,2) หรือไม่? ถ้าใช่แล้วประมาณ (0,0) และ (0.5,1)? (0,0) และ (0.25,0.5)? ไม่มีวิธีที่จะมีแนวคิดเกี่ยวกับขอบระหว่างจุดยอดดังนั้นนี่ไม่ใช่กราฟ
MAK

5

อัลกอริธึมในการค้นหาการจัดสรรหน่วยความจำที่มีอยู่ใช้โครงสร้างข้อมูลคล้ายฮีป ต่อไปนี้คัดลอกมาจากhttp://www.cprogramming.com/tutorial/virtual_memory_and_heaps.html

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


1
ฉันสงสัยอย่างมากเกี่ยวกับเรื่องนี้โดยเฉพาะ "... พื้นที่หน่วยความจำที่ว่างและสงวนไว้ถูกเก็บรักษาไว้ในโครงสร้างข้อมูลที่คล้ายกับต้นไม้ไบนารีที่เรียกว่าฮีป" ฟังดูแล้วเหมือนกับว่าผู้เขียนคาดเดาว่ามีการเชื่อมต่อตามชื่อ "heap" และอาจเข้าใจผิด ใครสามารถยืนยัน / ปฏิเสธได้
Don Hatch

1
หลังจากการวิจัยเบา ๆ เกี่ยวกับระบบ Binary Buddy (ใช้ใน Linux) มันสามารถถูกแสดงด้วยต้นไม้ไบนารีเนื่องจากวิธีการแบ่งพาร์ติชันข้อมูล ต้นไม้ไบนารีนี้ดูเหมือนฮีปสูงสุดที่ถูกต้องหากคุณสังเกตเห็นโหนดในแง่ของหน่วยความจำทั้งหมด แต่โหนดไม่ได้ถูกแทรกเข้าไปในต้นไม้ไบนารีนี้เนื่องจากมันอยู่ในฮีปสูงสุด - โหนดจะถูกแทรกโดยตรงในใบไม้ขนาดเล็กที่สุดของหน่วยความจำฟรี> = ขนาดที่ร้องขอ 1 2 3
Eric Dubé

1

หน่วยความจำสแตกคำศัพท์และหน่วยความจำฮีปไม่ได้ใช้ในมาตรฐาน C ++ มาตรฐานใช้การจัดเก็บแบบคงที่การจัดเก็บด้ายจัดเก็บอัตโนมัติและการจัดเก็บแบบไดนามิก

ดูเพิ่มเติมได้ที่ส่วนความทนทานต่อการจัดเก็บของมาตรฐาน

ดังนั้นจากภาษาและมุมมองไลบรารีมาตรฐานจึงไม่มีความสับสน


1

Q. กองคืออะไร? A. heap คือชุดของวัตถุที่วางซ้อนทับกัน

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


-2

บางทีหน่วยความจำฮีปแรกที่นำไปใช้นั้นได้รับการจัดการโดยโครงสร้างฮีป


8
สมมติฐานนั้นดูเหมือนจะไม่ชัดเจนเลย - ฮีป (โครงสร้างข้อมูล) มีประโยชน์อย่างไรในการรักษาฮีป (ขอบเขตหน่วยความจำแบบไดนามิก)
Keith Randall

7
-1 ฉันต้องการคำแถลงที่เชื่อถือได้มีหลักฐานมากกว่าสิ่งที่เห็นได้ชัดว่าเป็นการคาดเดา
ร็อบเคนเนดี้

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