रैखिक समय में सुपरस्टार कैसे खोजें?


28

निर्देशित रेखांकन पर विचार करें। हम एक नोड सुपरस्टार को कॉल करते हैं यदि और केवल अगर कोई अन्य नोड इससे नहीं पहुंच सकता है, लेकिन अन्य सभी नोड्स में बढ़त है । औपचारिक रूप से:v v

v superstar :⟺outdeg(v)=0indeg(v)=n1

साथ ग्राफ में नोड्स की संख्या। उदाहरण के लिए, नीचे दिए गए ग्राफ़ में, अधूरा नोड एक सुपरस्टार है (और अन्य नोड्स नहीं हैं)।n

एक सुपरस्टार
[ स्रोत ]

आप सभी सुपरस्टार्स को समय में निर्देशित ग्राफ़ में कैसे पहचान सकते हैं ? एक उपयुक्त ग्राफ प्रतिनिधित्व सामान्य उम्मीदवारों से चुना जा सकता है ; कृपया उन अभ्यावेदन का उपयोग करने से बचना चाहिए जो समस्या की जटिलता को प्रीप्रोसेसिंग की ओर ले जाते हैं।O(n)

घनत्व के संबंध में कोई धारणा नहीं बनाई जा सकती है। हम यह नहीं मानते कि ग्राफ में सुपरस्टार है; यदि कोई नहीं है, तो एल्गोरिथ्म को इसे पहचानना चाहिए।

संकेतन : एक नोड की संख्या है जो आउटगोइंग किनारों की है, आने वाले किनारों के लिए समान है।outdegindeg


1
क्या हमें की अनुमति है जहां किनारों पर है, या क्या हमें प्रत्येक शीर्ष पर केवल किनारों को देखने की आवश्यकता है ? O(n+k)kO(1)
केविन

@ केविन नं, एक सख्त आवश्यकता है। दूसरे प्रश्न के बारे में: मुझे पता नहीं है कि यहां तक ​​कि आवश्यक है, लेकिन आप निश्चित रूप से अधिक नहीं कर सकते। O(n)
राफेल

क्या आप जवाब जानते हैं? क्या यह में किया जा सकता है ? O(n)
डेव क्लार्क

@DaveClarke: हाँ, और हाँ।
राफेल

आपको प्रतिनिधित्व को और अधिक प्रतिबंधित करना चाहिए; एक रैखिक एल्गोरिथ्म एक आसन्न सूची के लिए असंभव है (सिर्फ यह पुष्टि करने के लिए कि एक शीर्ष सुपरस्टार है, आपको प्रत्येक शीर्ष पर पूरी सूची से गुजरने की आवश्यकता हो सकती है)।
गिल्स एसओ- बुराई को रोकना '

जवाबों:


18

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

vertex superstar(graph g)
    current vertex = first
    # Go through each vertex
    for each subsequent vertex in g ("next")
        # If there's an edge from this to the next, we eliminate this one [move to the new one].
        # If not, we just stay here.
        if edge exists from current to next
            candidate = next
        end if
    end for
    # Now we are on the final remaining candidate, check whether it satisfies the requirements.
    # just a rename for clarity
    candidate = current
    for each other vertex in g
        if edge from current to other exists
            return null 
        else if no edge from other to current
            return null
        end if
    end for
    return candidate
end superstar

आइए एक उदाहरण के माध्यम से चलकर विधि का वर्णन करें। इस सरणी को, शीर्ष पर स्रोत शीर्ष के साथ और पक्ष पर गंतव्य के साथ लें। 1 एक किनारे को इंगित करता है:

12341101210131114110

मैंने उन शीर्षकों को ग्रे कर दिया है जिन्हें हमने संभावित सुपरस्टार के रूप में खारिज किया है। हम उन किनारों को इंगित करने के लिए हरे और लाल रंग का उपयोग करेंगे जो हम देख रहे हैं जब वे करते हैं और उस किनारे को शामिल नहीं करते हैं जिसे हम खोज रहे हैं, और नीले रंग को इंगित करने के लिए जहां हम पहले ही देख चुके हैं।

हम शीर्ष 1 और 2 को देखकर शुरू करते हैं।

12341101210131114110
हरे रंग की संख्या से पता चलता है कि 2 से 1 तक बढ़त है, इसलिए हम 2 को खत्म करते हैं और एक बढ़त की तलाश करते हैं 3 से 1:

12341101210131114110

हम देखते हैं कि ऐसी कोई बढ़त नहीं है, इसलिए हम 1 को खत्म करते हैं और 3 को हमारे वर्तमान शीर्ष के रूप में लेते हैं। याद रखें कि हमने पहले ही 2 को समाप्त कर दिया है, इसलिए देखें कि क्या 4 से 3 तक बढ़त है:

12341101210131114110

4 से 3 तक एक बढ़त है, इसलिए हम 4 को खत्म कर देते हैं। इस बिंदु पर हमने सभी (3) में से एक को समाप्त कर दिया है, इसलिए इसके किनारों की जांच करें और देखें कि क्या यह योग्य है:

12341101210131114110

1 से 3 तक बढ़त है, लेकिन रिवर्स नहीं है, इसलिए 3 अभी भी एक उम्मीदवार है।

12341101210131114110

2 से 3 तक बढ़त भी है, लेकिन रिवर्स नहीं है, इसलिए 3 अभी भी एक उम्मीदवार है।

12341101210131114110

4 से 3 तक बढ़त है लेकिन 3 से 4 नहीं; जो 3 के किनारों की हमारी जाँच पूरी करता है और हमने पाया है कि यह वास्तव में एक सुपरस्टार है।

चूंकि हम पहले एज चेक में से प्रत्येक पर एक संभावित सुपरस्टार के रूप में एक शीर्ष को समाप्त करते हैं , इसलिए सबसे अच्छा मामला यह है कि वें चेक जटिलता के लिए अंतिम शीर्ष को समाप्त करता है । सबसे खराब स्थिति में (अंतिम या दूसरे-से-अंतिम शीर्ष पर एक सुपरस्टार है, या अंतिम चेक इसे अयोग्य घोषित करता है), पहले तुलना के बाद हम उम्मीदवार की तुलना अधिक वर्टिकल के साथ करते हैं, ( ) की सबसे खराब स्थिति । तो, यह एल्गोरिथ्म ।n1nnn12×(n1)3n3O(n)Θ(n)


8

क्या यह सेलिब्रिटी समस्या नहीं है ?

एक होने पर केवल एक सुपरस्टार (सेलिब्रिटी) होगा।

हम आसन्न मैट्रिक्स प्रतिनिधित्व का उपयोग करते हैं, जहां यदि से तक एक निर्देशित किनारा है , अन्यथा यह । (मैं अनुमान लगा रहा हूं कि अनुमति दी गई है)।A[i,j]=1ij0

को देख कर (में किया जा सकता समय) हम सेलिब्रिटी होने के लिए एक उम्मीदवार के रूप में उनमें से कम से कम एक को समाप्त कर सकते: यदि , तो आप खत्म कर सकते हैं । यदि तो हम को समाप्त कर सकते हैं ।A[i,j]O(1)A[i,j]=1iA[i,j]=0j

एक-एक करके सभी मौजूदा उम्मीदवारों की सूची बनाए रखें। एक लिंक की गई सूची पर्याप्त होनी चाहिए।

अंत में, आप सत्यापित कर सकते हैं कि आपका उम्मीदवार वास्तव में सुपरस्टार है या नहीं।

यह एल्गोरिथ्म ।O(n)


आप निरंतर समय में उपयुक्त का चयन कैसे करते हैं ? (i,j)
राफेल

3
@ राफेल: लिंक की गई सूची से पहले दो उम्मीदवारों को चुनें। (सिर और सिर-> अगला)।
आर्यभट्ट

6

यह उत्तर उस प्रश्न के संस्करण को संबोधित करता है जहां कोई भी ग्राफ प्रतिनिधित्व संभव था, न कि प्रश्न का वर्तमान संस्करण।

  • आसन्न सूची और रिवर्स आसन्न सूची की एक जोड़ी के रूप में अपने ग्राफ को स्टोर करें, जहां प्रत्येक सूची में सूची की लंबाई के अलावा होता है, इसलिए क्रमशः संख्या- और-इन-किनारों,।

  • प्रीप्रोसेसिंग: रिवर्स एडजेंसी लिस्ट (यानी किनारों की सूची) की गणना करें। लागत ।O(|E|)

  • सूचियों को ट्रेस करें और किसी भी नोड का चयन करें जहां आउट-किनारों की संख्या और इन-किनारों की संख्या । लागत ।0n1O(|N|)


ठीक है, मैं देख रहा हूं कि किसी भी ग्राफ प्रतिनिधित्व की अनुमति बहुत कमजोर है। मैंने इस सवाल को प्रतिबंधित कर दिया कि मैं क्या चाहता हूं।
राफेल

2

केवल संदर्भ के लिए, केविन ने जो पोस्ट किया था उसके पुनरावर्ती संस्करण का छद्म कोड।

superstar(V, E) {
  if ( |V| == 1 ) {
    return V.pop
  }

  a = V.pop
  b = V.pop
  if ( (a,b) ∈ E ) {
    no_ss = a
    keep  = b
  }
  else {
    no_ss = b
    keep = a
  }

  s = superstar(V ++ keep)

  return ( s != null && (no_ss, s) ∈ E && !(s, no_ss) ∈ E ) ? s : null
}

hasSuperstar(V, E) = superstar(V, E) != null
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.