2011-03-30 23 views
7

से किसी आइटम को निकालना पायथन में, heapq मॉड्यूल प्राथमिकता कतार प्रदान करता है।प्राथमिकता कतार

इसमें आइटम डालने और पॉप करने के तरीके हैं।

आपने जो आइटम डाला है उसे हटाएं जो कतार से सबसे कम प्राथमिकता नहीं है?

(वैकल्पिक अन्य संग्रह का उपयोग कर ऐसा करने के लिए वैकल्पिक व्यंजनों स्वागत भी कर रहे हैं)

उत्तर

11

heapq मॉड्यूल अंतर्निहित डेटा संरचना के रूप में मानक अजगर सूचियों का उपयोग करता है, तो आप सिर्फ इस के बाद फिर से मानक list विधि remove() और heapify() उपयोग कर सकते हैं। ध्यान दें कि हालांकि इसे रैखिक समय की आवश्यकता होगी।

# Create example data and heapify 
a = range(10) 
a.reverse() 
heapq.heapify(a) 
print a 

# remove an element and heapify again 
a.remove(5) 
heapq.heapify(a) 
print a 

आप गैर-दस्तावेजी समारोह heapify._siftup() का उपयोग करके फिर से heapifying के प्रदर्शन में सुधार सकता है, लेकिन पूरी प्रक्रिया अभी भी हे (एन) list.remove() के बाद से किया जाएगा हे (एन) है।

+1

लेकिन यह ढेर invariant को नष्ट कर देगा? – Will

+1

@Will: heapify() invariant को पुनर्स्थापित करता है। – Macke

+0

@Will, मैके: भ्रम के लिए खेद है। मैंने पहले एक संस्करण पोस्ट किया था जिसमें उल्लेख नहीं किया गया था कि आपको फिर से 'heapify()' को कॉल करना होगा, लेकिन इसे तुरंत ठीक किया गया है। –

2

एक डेटा संरचना है जिसे treap कहा जाता है जो प्राथमिकता कतार और बाइनरी पेड़ संयुक्त है। (वृक्ष की ढेर)। यह लॉग-एन खोज की अनुमति देता है जो आपकी मदद कर सकता है।

def heapq_remove(heap, index): 
    """Remove item from heap""" 

    # Move slot to be removed to top of heap 
    while index > 0: 
     up = (index + 1)/2 - 1 
     heap[index] = heap[up] 
     index = up 

    # Remove top of heap and restore heap property 
    heapq.heappop(heap) 
3

यह लॉग (एन) समारोह मेरे लिए काम करता है,

वहाँ एक Python treap implementation on PyPi .. है :

a[k] = a.pop() 
heapq.heapify(a) 

पहला कदम अब हे (1) समय है, और दूसरा गैर-दस्तावेजी डेटा का उपयोग करके बनाया जा सकता है ओ (लॉग (एन))। बेशक, यह अभी भी ओ (एन) है, यदि आपके पास पहले से नहीं है।

4

आप आइटम आप निकालना चाहते हैं के स्थान पता है, तो आप निम्न कर सकते हैं:)

+0

आप ओ (लॉग (एन)) समय में के खोजने के लिए पाइथन के बिसेक्ट मॉड्यूल का उपयोग कर सकते हैं, जो इस पूरे समाधान ओ (लॉग (एन)) को बनाएगा। – javawizard

+0

@javawizard क्षमा करें, लेकिन मैं आपको नहीं मिला क्योंकि मैं ढेर में अपने तत्व का स्थान/अनुक्रमणिका कैसे ढूंढ सकता हूं? मैं dict बनाए रखने के बारे में सोच रहा था, लेकिन हर बार जब मैं ढेर में डालता हूं तो मुझे उस निर्देश को संशोधित करना होगा। – Naman

+0

सावधान रहें, एक [के] = a.pop() सूची में अंतिम तत्व के लिए काम नहीं करता है – gizzmole

संबंधित मुद्दे