2009-07-07 19 views
10

java.util.PriorityQueue निर्माण समय पर Comparator को पारित करने की अनुमति देता है। तत्वों को सम्मिलित करते समय, उन्हें तुलनित्र द्वारा निर्दिष्ट प्राथमिकता के अनुसार आदेश दिया जाता है।जावा में प्राथमिकता पंक्तियां

क्या होता है जब तत्व की प्राथमिकता डालने के बाद बदल जाती है? PriorityQueue तत्वों को पुन: व्यवस्थित करता है? क्या ऐसे तत्व को मतदान करना संभव है जिसमें वास्तव में न्यूनतम प्राथमिकता न हो?

क्या प्राथमिकता कतार के अच्छे कार्यान्वयन हैं जो प्रभावी प्राथमिकता अपडेट की अनुमति देते हैं?

+0

क्या मैं पूछ सकता हूं कि आप किस समाधान के साथ गए थे? मेरे पास समान है, लेकिन साथ ही साथ बहुत अलग समस्या है, जहां मुझे ** सभी प्रविष्टियों की प्राथमिकताओं को फिर से समझना होगा ** समय के अनुसार शेष (कम स्लैक टाइम शेड्यूलिंग)। –

उत्तर

13

आपको तत्व को हटा देना चाहिए, इसे बदलना चाहिए, और पुनः डालना चाहिए, क्योंकि इसे डालने पर ऑर्डरिंग होती है। हालांकि इसमें कई कदम शामिल हैं, यह कुशल है पर्याप्त अच्छा हो सकता है। (मैंने अभी ओ (एन) हटाने के बारे में टिप्पणी देखी है।)

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

6

मैं PriorityQueue उम्मीद करेंगे चीजों को पुन: व्यवस्थित नहीं करने के लिए - और यह बहुत भ्रमित हो सकता है अगर यह किसी भी नई प्रविष्टियाँ डाल करने के लिए सही जगह खोजने के लिए एक द्विआधारी खोज करने के लिए प्रयास करता है।

आम तौर पर बोलते हुए मैं एक कतार में पहले से ही किसी चीज की प्राथमिकता को बदलने की उम्मीद करता हूं, एक हैश टेबल में एक कुंजी बनाने के मूल्यों को बदलने की तरह।

+0

कुछ एल्गोरिदम (उदा। डिजस्ट्रा के एल्गोरिदम) के लिए यह वास्तव में उपयोगी होगा ताकि कतार में पहले से कुछ की प्राथमिकता को बदल सके। –

+1

लेकिन इसके बारे में एक अधिसूचना होनी होगी। यदि प्राथमिकता बदलती है तो आइटम को हटाकर और फिर से जोड़कर प्राथमिकता क्यूई से किसी भी मदद के बिना आप इसे नकली बना सकते हैं। –

+1

@ जोन मैं गलत हूं, तो मुझे सही करें, लेकिन मेरा मानना ​​है कि सूर्य के कार्यान्वयन के लिए ओ (एन) निकालना है, इसलिए यह ओ (एन लॉग एन) होने के समाप्त होता है, जबकि यदि आप आंतरिक रूप से अपडेट कर सकते हैं तो यह केवल ओ होगा (लॉग एन)। ऐसा लगता है कि एक अद्यतन को मजबूर करने की क्षमता अच्छी होगी। –

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