दो अलग-अलग अवधारणाएं दोनों को "हीप" क्यों कहा जाता है?


170

सी-स्टाइल भाषाओं में डायनेमिक मेमोरी एलोकेशन के लिए रनटाइम हीप का उपयोग क्यों किया जाता है और डेटा संरचना दोनों को "हीप" कहा जाता है? क्या कुछ रिश्ता है?


4
डेटा संरचनाओं का अध्ययन करते समय मैं आज यह सोच रहा था।
मितमरो


3
एक अंग्रेजी शब्दकोश में जाएं और "रन" के तहत प्रविष्टियों की संख्या गिनें। 40+ प्रविष्टियों में से कितने कंप्यूटर पर लागू होती हैं? :)
jmucchiello


एक संबंधित पोस्ट यहाँ wrt रनटाइम हीप को डायनामिक मेमोरी आवंटन के लिए उपयोग किया जाता है।
RBT

जवाबों:


77

डोनाल्ड नुथ कहते हैं (द आर्ट ऑफ़ कंप्यूटर प्रोग्रामिंग, थर्ड एड।, खंड 1, पृष्ठ 435)।

उपलब्ध स्मृति के पूल को "ढेर" कहने के लिए कई लेखकों ने 1975 से शुरुआत की।

वह यह नहीं कहता है कि कौन से लेखक और किसी भी विशिष्ट पत्र का संदर्भ नहीं देते हैं, लेकिन कहते हैं कि प्राथमिकता वाले कतारों के संबंध में "हीप" शब्द का उपयोग शब्द का पारंपरिक अर्थ है।


11
पूल हीप से बेहतर नाम होगा।

7
दिलचस्प। किसी को उससे पूछना चाहिए कि क्या उसे याद है कि कौन से लेखक हैं।
प्रो। फल्केन

27
विकिपीडिया का दावा है कि ऐसा इसलिए है क्योंकि प्रारंभिक स्तर पर लिस्प ने अपने मेमोरी स्टोर को लागू करने के लिए एक ढेर (डेटा संरचना) का उपयोग किया था। यह नहीं कहता कि कैसे। इसका संदर्भ "थॉमस एच। कॉर्मेन, चार्ल्स ई। लिसेरसन, रोनाल्ड एल। रिवेस्ट (1990): एल्गोरिदम के लिए है। एमआईटी प्रेस / मैकग्रा-हिल।", जो मेरे पास नहीं है।
स्टीव जेसोप

2
इसके लिए मेरे पास कोई संदर्भ नहीं है, लेकिन मेरा अनुमान है कि शुरू में स्मृति के खुले ब्लॉकों को व्यवस्थित करने के लिए इस्तेमाल किया जाने वाला डेटा संरचना एक मिनट का ढेर था। ऐसा लगता है कि यह कम से कम स्मृति के सबसे छोटे ब्लॉक को खोजने का एक सभ्य तरीका होगा जो आपको उस डेटा को संग्रहीत करने की अनुमति देगा जिसे आप अपडेट करने की कोशिश कर रहे थे: मैंने जो कहा था वह वास्तव में मित्र ब्लॉक की तरह लगता है en.wikipedia.org/wiki/Dynamic -memory_allocation # बडी% 5Fblocks
विल

4
@SteveJessop - चेकिंग कॉर्मेन, लीसेरसन, रिवेस्ट, स्टीन - 3 संस्करण (2009) हीप्सर्ट चैप्टर की शुरुआत में यह केवल कहता है कि "हीप" शब्द मूल रूप से हीट के संदर्भ में गढ़ा गया था, लेकिन यह तब से "संदर्भित" आया है कचरा-संग्रहित भंडारण, ”जैसे कि प्रोग्रामिंग भाषाएं जावा और लिस्प प्रदान करती हैं। हमारी ढेर डेटा संरचना कचरा-संग्रहित भंडारण नहीं है, और जब भी हम इस पुस्तक में ढेर का उल्लेख करते हैं, तो हमारा मतलब होगा कचरा संग्रहण के एक पहलू के बजाय एक डेटा संरचना। ' सीएलआरएस - 2 वें संस्करण में भी लगभग सटीक एक ही वाक्यांशिंग है (कोई संकेत नहीं है कि लिस्प ने एक ढेर का इस्तेमाल किया है)।
डॉ। जिंबाब

64

उनके पास एक ही नाम है लेकिन वे वास्तव में समान नहीं हैं (यहां तक ​​कि वैचारिक रूप से)। एक मेमोरी हीप को एक हीप कहा जाता है, उसी तरह आप कपड़े धोने की टोकरी को "कपड़े का ढेर" कहते हैं। यह नाम कुछ गड़बड़ जगह को इंगित करने के लिए उपयोग किया जाता है, जहां मेमोरी आवंटित की जा सकती है और वसीयत में निपटाया जा सकता है। डेटा संरचना (जैसा कि विकिपीडिया लिंक आप संदर्भ बताते हैं) काफी अलग है।


8
हां, मुझे लगता है कि यह वह बिंदु है जिस पर वह अपने प्रश्न को आधार बना रहा है: वे अलग हैं। तो उन्हें एक ही चीज क्यों कहा जाता है - क्या कुछ अंतर्निहित संबंध है।
सीन ओवेन

9
जिस तरह से मैंने इस उत्तर की व्याख्या की, "नहीं, कोई अंतर्निहित संबंध नहीं है", इसलिए यह प्रश्न का उत्तर देता है।
लॉरेंस गोंसाल्वेस 4

एंड्रयू जवाब दे रहा है कि। कोई संबंध नहीं है। यह केवल संयोग है। मेमोरी के आम उपयोग के लिए मेमोरी हीप अधिक सही है क्योंकि मेमोरी को "कपड़े के ढेर" के रूप में आवंटित किया जाता है। डेटा संरचना हालांकि कल्पना की एक बड़ी खिंचाव की मांग की। और यह एक बहुत अधिक दिलचस्प "क्यों" बन जाता है। नाम तथ्य नोड से आता है उनकी कुंजी द्वारा व्यवस्थित किया जाता है और एक माता-पिता नोड कुंजी हमेशा अपने बच्चे के नोड की तुलना में> = होती है।
एलेक्जेंडर बेल

6
वे निश्चित रूप से असंबंधित हैं। हालाँकि इसे "हीप" कहने में समस्या यह है कि "हीप" के समकक्ष - "स्टैक" - भी एक वास्तविक स्टैक है।
dan

1
मुझे पता है कि क्यों ढेर डेटा संरचना को एक ढेर कहा जाता है: क्योंकि यह ढेर संपत्ति को संतुष्ट करता है। लेकिन ढेर संपत्ति को ऐसा क्यों कहा जाता है? मुझे इससे कोई मतलब नहीं है, क्योंकि "टॉप हैवी" जैसा नाम ज्यादा बेहतर होगा।
थॉमस एडिंग

31

नाम टक्कर दुर्भाग्यपूर्ण है, लेकिन यह सब रहस्यमय नहीं है। ढेर एक छोटा, सामान्य शब्द है जिसका उपयोग ढेर, संग्रह, समूह, आदि के लिए किया जाता है। डेटा संरचना के लिए शब्द का उपयोग प्री-डेट्स (मुझे पूरा यकीन है) मेमोरी के पूल का नाम है। वास्तव में, पूल मेरी राय में, बाद के लिए एक बेहतर विकल्प होगा। हीप एक ऊर्ध्वाधर संरचना (ढेर की तरह) को दर्शाता है, जो डेटा संरचना के साथ फिट बैठता है, लेकिन मेमोरी पूल नहीं। हम मेमोरी-पूल के ढेर को श्रेणीबद्ध नहीं मानते हैं, जबकि डेटा संरचना के पीछे मूलभूत विचार सबसे बड़ा तत्व हीप (और उप-ढेर) के शीर्ष पर है।

डेटा संरचना को ढेर करने के लिए 60 के दशक के मध्य में वापस आता है; स्मृति पूल, 70 के दशक के प्रारंभ। हीप (अर्थ मेमोरी पूल) शब्द का इस्तेमाल कम से कम 1971 के शुरुआती दौर में विजगार्डन द्वारा अल्गोल की चर्चा में किया गया था ।

संभवतः डेटा संरचना के रूप में हीप का जल्द से जल्द उपयोग सात साल पहले
विलियम्स, JWJ 1964 में पाया जाता है । "एल्गोरिथम 232 - हीप्सॉर्ट", एसीएम 7 (6) का संचार : 347-348


1
हां, लेकिन एक ढेर भी अव्यवस्था और स्मृति ढेर आमतौर पर अव्यवस्थित हैं। डेटा संरचना ढेर बहुत अच्छी तरह से आदेश दिया है। तो फिर से एक समान बेमेल है जो ढेर की सामान्य परिभाषा के आधार पर दूसरे रास्ते पर जा रहा है।
jmucchiello

इसे हमेशा स्टैक के विपरीत के रूप में पेश किया जाता है जिसे IMO नाम की व्याख्या करने के लिए पर्याप्त होना चाहिए।
रीइनियरिएपोस्ट

1
यह संयोग नहीं है - मुफ्त सूची को एक द्विपदीय ढेर के माध्यम से प्राथमिकता कतार के रूप में लागू किया जा सकता है।
हीथ हनीनिकट

2
@jmucchiello: लॉग का ढेर ( चित्र देखें ) अच्छी तरह से आदेश दिया गया है और पेड़ जैसा दिखता है। यह मेरी स्नातक की पुस्तकों में से एक के अनुसार डेटा संरचना के नाम की उत्पत्ति है।
जियोले

6

दरअसल, मेमोरी को आवंटित करने के तरीके के बारे में पढ़ना ( बडी ब्लॉक देखें ) मुझे डेटा संरचनाओं में एक ढेर की याद दिलाता है।


पीटर झांग के जवाब पर मेरी टिप्पणी भी यहां प्रासंगिक है। द्विआधारी दोस्त प्रणाली को एक द्विआधारी पेड़ के रूप में दर्शाया जा सकता है, और यह एक वैध अधिकतम ढेर के रूप में भी दिखता है जब प्रत्येक नोड की "कुंजी" उसके नीचे कुल मेमोरी होती है (लेकिन ये मान निहित हैं और कभी नहीं बदलते हैं)। न तो आवंटन और न ही मुक्त एल्गोरिथ्म इस बाइनरी पेड़ पर ढेर संचालन का उपयोग करता है, जहां तक ​​मैं बता सकता हूं।
एरिक दुबे

5

IMO यह केवल एक दुर्घटना / संयोग है कि इन दो पूरी तरह से असंबंधित चीजों का एक ही नाम है। इसका ग्राफ और ग्राफ की तरह ।


दो रेखांकन हालांकि किसी भी तरह से संबंधित हो सकते हैं। एक फंक्शन के ग्राफ की कल्पना इस प्रकार करें: टुपल डोमेन, रेंज) एक वर्टेक्स है और एक किनारे दो ऐसे

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
मुझे इस पर बेहद संदेह है, विशेष रूप से "... स्मृति के मुक्त और आरक्षित क्षेत्रों को ढेर के समान बाइनरी पेड़ों के समान एक डेटा संरचना में बनाए रखा जाता है।" यह मुझे लगता है जैसे लेखक अनुमान लगा रहा है कि "हीप" नाम के आधार पर एक कनेक्शन है, और शायद गलत है। क्या कोई पुष्टि / खंडन कर सकता है?
डॉन हैच

1
बाइनरी बडी सिस्टम (लिनक्स में प्रयुक्त) पर कुछ हल्के शोध के बाद, यह डेटा विभाजन के कारण एक बाइनरी ट्री द्वारा दर्शाया जा सकता है। यदि आप कुल मेमोरी के संदर्भ में नोड्स का निरीक्षण करते हैं तो यह बाइनरी ट्री एक मान्य अधिकतम ढेर की तरह दिखता है, लेकिन नोड्स को इस बाइनरी ट्री में नहीं डाला जाता है क्योंकि वे एक अधिकतम ढेर में होते हैं - नोड्स को मुफ्त मेमोरी के सबसे छोटे पत्ते में सीधे डाला जाता है> = अनुरोधित आकार। 1 2 3
एरिक दुबे

1

बोलचाल की शर्तें स्टैक मेमोरी और हीप मेमोरी C ++ मानक में उपयोग नहीं की जाती हैं। मानक स्थैतिक भंडारण, थ्रेड स्टोरेज, स्वचालित भंडारण और गतिशील भंडारण का उपयोग करता है।

मानक के संग्रहण अवधि अनुभाग में अधिक पाया जा सकता है ।

इसलिए, भाषा और मानक पुस्तकालय के दृष्टिकोण से, कोई भ्रम नहीं है।


1

Q. एक ढेर क्या है? A. ढेर एक दूसरे के ऊपर वस्तुओं के स्थान का एक संग्रह है।

आपके प्रश्न का उत्तर: मेमोरी हीप और बाइनरी हीप दोनों एक ही अवधारणा का उपयोग करते हैं जैसा कि आप जानते हैं। डेटा को प्रोग्राम में लिखे अनुसार उसी क्रम में मेमोरी में एक ढेर के रूप में संग्रहीत किया जाता है, जबकि बाइनरी हीप एक डेटा संरचना है जो एक हीप में डेटा को स्टोर करने के तरीके में समान अवधारणा का अनुसरण करता है (डेटा ऑन टॉप) दूसरे का)। मुझे पता है कि आप टिप्पणी अनुभाग में क्या सोचते हैं।


-2

शायद लागू की गई पहली मेमोरी हीप को ढेर संरचना द्वारा प्रबंधित किया गया था?


8
वह परिकल्पना बिल्कुल स्पष्ट नहीं लगती है - एक ढेर (गतिशील मेमोरी क्षेत्र) को बनाए रखने के लिए एक ढेर (डेटा संरचना) कैसे उपयोगी है?
कीथ रान्डेल

7
-1। मैं स्पष्ट रूप से सिर्फ एक अनुमान के बजाय सबूत के साथ एक आधिकारिक बयान पसंद करूंगा।
रॉब कैनेडी

लगभग नामुमकिन। वहाँ ढेर (डेटा संरचना) का उपयोग करने के लिए ढेर (मुक्त स्मृति के पूल) का प्रबंधन करने के लिए कोई अच्छा कारण नहीं लगता है।
जेसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.