Python का heapq
मॉड्यूल एक अत्यंत कुशल मिन-हीप कार्यान्वयन प्रदान करता है। परिभाषा के अनुसार, एक मिन-हीप अपने सबसे छोटे तत्व को मूल (सूचकांक 0) पर रखता है। तत्वों को जोड़ने (heappush
) और हटाने (heappop
) सामान्य संक्रियाएँ हैं, लेकिन अक्सर आपको हीप की संरचना को बदले बिना सबसे छोटे तत्व की जांच करने की आवश्यकता होगी—एक प्रक्रिया जिसे हम “पीकिंग” कहते हैं। यह गाइड Python हीप में झाँकने के इष्टतम और वैकल्पिक तरीकों का पता लगाता है।
विषय-सूची
मिन-हीप्स को समझना
एक मिन-हीप एक वृक्ष-आधारित डेटा संरचना है जहाँ प्रत्येक नोड का मान उसके बच्चों के मान से कम या उसके बराबर होता है। heapq
इसे एक सूची के रूप में दर्शाता है, जिसमें मूल (सबसे छोटा तत्व) आसानी से सूचकांक 0 पर स्थित होता है। प्रमुख heapq
फलन इस प्रकार हैं:
heappush(heap, item)
: एक आइटम जोड़ता है, हीप गुणधर्म को बनाए रखता है।heappop(heap)
: सबसे छोटे आइटम को हटाता है और लौटाता है, हीप गुणधर्म को बनाए रखता है।heapify(x)
: एक सूची को इन-प्लेस में हीप में परिवर्तित करता है।
कुशल पीकिंग: heap[0]
विधि
न्यूनतम मान पर झाँकने का सबसे कुशल तरीका सीधे heap[0]
तक पहुँचना है। यह मिन-हीप गुणधर्म का लाभ उठाता है, हीप को संशोधित किए बिना एक स्थिर-समय (O(1)) संक्रिया प्रदान करता है।
import heapq
heap = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
heapq.heapify(heap)
smallest = heap[0]
print(f"सबसे छोटा तत्व: {smallest}") # आउटपुट: सबसे छोटा तत्व: 1
print(f"हीप अपरिवर्तित: {heap}") # आउटपुट: हीप अपरिवर्तित: [1, 3, 2, 4, 5, 9, 5, 6, 5, 3]
वैकल्पिक पीकिंग विधियाँ
हालांकि कम कुशल, विशिष्ट परिदृश्यों के लिए वैकल्पिक विधियाँ मौजूद हैं:
heappop()
और heappush()
का उपयोग करना: यह दृष्टिकोण अस्थायी रूप से सबसे छोटे तत्व को हटाता है, फिर उसे वापस जोड़ता है। इसमें शामिल हीप पुनर्गठन के कारण यह काफी धीमा (O(log n)) है। केवल तभी इसका उपयोग करें जब आपको न्यूनतम तत्व को हटाने के साथ झाँकने की आवश्यकता हो।
import heapq
heap = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
heapq.heapify(heap)
smallest = heapq.heappop(heap)
print(f"सबसे छोटा तत्व: {smallest}") # आउटपुट: सबसे छोटा तत्व: 1
heapq.heappush(heap, smallest)
print(f"हीप बहाल: {heap}") # आउटपुट: हीप बहाल: [1, 3, 2, 4, 5, 9, 5, 6, 5, 3]
nsmallest()
का उपयोग करना: heapq.nsmallest(n, iterable)
n
सबसे छोटे तत्व देता है। केवल एक (nsmallest(1, heap)
) का अनुरोध करने से झाँकना संभव होता है। हालाँकि, एकल-तत्व झाँकने के लिए यह heap[0]
से कम कुशल है (हालांकि कई सबसे छोटे तत्वों को पुनः प्राप्त करने के लिए कुशल)।
import heapq
heap = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
heapq.heapify(heap)
smallest = heapq.nsmallest(1, heap)[0]
print(f"सबसे छोटा तत्व: {smallest}") # आउटपुट: सबसे छोटा तत्व: 1
print(f"हीप अपरिवर्तित: {heap}") # आउटपुट: हीप अपरिवर्तित: [1, 3, 2, 4, 5, 9, 5, 6, 5, 3]
सही पीकिंग विधि चुनना
सरल झाँकने के लिए, सीधे heap[0]
तक पहुँचना इसकी गति और सरलता के कारण स्पष्ट विजेता है। वैकल्पिक विधियाँ केवल विशिष्ट स्थितियों में उपयोगी होती हैं जहाँ आपको अन्य हीप संक्रियाएँ भी करने की आवश्यकता होती है।