2016-01-19 6 views
6

लंबाई n की स्ट्रिंग को देखते हुए, क्या ओ (एन) में s में विशिष्ट सबस्ट्रिंग की संख्या गिनना संभव है?क्या ओ (एन) में एक स्ट्रिंग में विशिष्ट सबस्ट्रिंग की संख्या गिनना संभव है?

उदाहरण

इनपुट: abb

आउटपुट: 5 ('abb', 'ab', 'bb', 'a', 'b')

मैं कुछ शोध किया है, लेकिन मैं एक एल्गोरिथ्म है कि इस तरह के एक में इस समस्या का हल खोजने के लिए नहीं कर पा रहे प्रभावशाली तरीका। मुझे पता है कि ओ (एन^2) दृष्टिकोण संभव है, लेकिन क्या एक और अधिक कुशल एल्गोरिदम है?

मुझे प्रत्येक सबस्ट्रिंग्स को प्राप्त करने की आवश्यकता नहीं है, केवल अलग-अलग लोगों की कुल संख्या (यदि इससे कोई फर्क पड़ता है)।

+0

'बीए' एबीबी का एक सबस्ट्रिंग नहीं है। – gnasher729

+0

@ gnasher729 आप सही हैं, किसी ने इसे पहले ही संपादित कर लिया है। – donrondon

+0

मुझे लगता है कि यह प्रश्न यहां होना चाहिए: https://cs.stackexchange.com/ – ChaosPredictor

उत्तर

8

आप Ukkonen एल्गोरिथ्म का उपयोग कर सकते रैखिक समय में एक प्रत्यय पेड़ के निर्माण के लिए:

https://en.wikipedia.org/wiki/Ukkonen%27s_algorithm

रों की सबस्ट्रिंग की संख्या तो trie, तो आप बस गणना कर सकते हैं, जिसमें तार के उपसर्गों की संख्या है रैखिक समय में। यह सभी नोड्स में वर्णों की कुल संख्या है। पेड़ में

  /\     
      b a 
      | b 
      b b 

5 अक्षर, तो 5 सबस्ट्रिंग:

उदाहरण के लिए, अपने उदाहरण की तरह एक प्रत्यय पेड़ पैदा करता है। प्रत्येक अद्वितीय स्ट्रिंग एक अलग अक्षर के बाद समाप्त होने वाली जड़ से एक पथ है: abb, ab, a, bb, b। तो तारों की संख्या पेड़ में अक्षरों की संख्या है।

अधिक स्पष्ट:

  • हर-स्ट्रिंग स्ट्रिंग के कुछ प्रत्यय उपसर्ग है;
  • सभी प्रत्यय trie में हैं;
  • तो त्रिभुज (त्रिभुज की परिभाषा के अनुसार) के माध्यम से सबस्ट्रिंग्स और पथों के बीच 1-1 पत्राचार होता है;
    • प्रत्येक विशिष्ट गैर खाली पथ अपने पिछले पत्र के बाद एक अलग स्थिति में समाप्त होता है;: और
    • वहाँ क्योंकि, पेड़ और गैर खाली रास्तों में अक्षरों के बीच 1-1 से पत्राचार है और
    • स्थिति प्रत्येक अक्षर के निम्नलिखित के लिए पथ अद्वितीय लोग हैं, जो सोच रहे हैं कि यह कैसे एक पेड़ है कि हे में हे (एन^2) वर्ण हैं का निर्माण संभव हो सकता है के लिए

नोट है (एन) समय:

प्रत्यय वृक्ष के प्रतिनिधित्व के लिए एक चाल है। पेड़ के नोड्स में वास्तविक तारों को संग्रहीत करने के बजाय, आप केवल ओरिएंटल स्ट्रिंग में पॉइंटर्स स्टोर करते हैं, इसलिए "abb" वाले नोड में "abb" नहीं है, इसमें प्रति (0,3) - 2 पूर्णांक हैं नोड, इस पर ध्यान दिए बिना कि प्रत्येक नोड में स्ट्रिंग कितनी देर तक है, और प्रत्यय के पेड़ में ओ (एन) नोड्स हैं।

+0

धन्यवाद तुम्हारे जवाब के लिए। आपके द्वारा संदर्भित विकिपीडिया लेख में कहा गया है कि युकोनन का एल्गोरिदम ओ (एन) समय प्राप्त करता है, लेकिन केवल स्थिर आकार के अक्षरों के लिए, इसका क्या अर्थ है? साथ ही, मुझे समझ में नहीं आ रहा है कि 's' के सबस्ट्रिंग्स की संख्या" सभी नोड्स में वर्णों की कुल संख्या "(Ukkonen के परिणामी पेड़ के) क्यों है। – donrondon

+0

"निरंतर आकार वाले अक्षर" का अर्थ स्ट्रिंग में से चुनने के लिए सीमित संख्या में वर्ण हैं, जैसे कि 26 अक्षरों, या 256 बाइट्स, या 65536 वर्ण, इत्यादि। विकल्प अनियमित रूप से असंबद्ध पूर्णांक जैसे अनंत अक्षरों पर अनुक्रमों के लिए प्रत्यय पेड़ है । –

+0

मैंने आपके अन्य प्रश्न –

2

LCP array का निर्माण और सबस्ट्रिंग्स (एन (एन + 1)/2) से इसकी राशि घटाएं।

+0

क्या आप ओ (एन) में एलसीपी सरणी बनाने का तरीका बता सकते हैं ?, मुझे इसके बारे में कुछ जानकारी मिली है, लेकिन मैं थोड़ा सा हूँ थोड़ा खो गया – donrondon

+0

@donrondon क्या आपके पास प्रत्यय वृक्ष है? –

+0

मुझे पता है कि ओ (एन^2) में से एक को कैसे बनाया जाए, लेकिन ओ (एन) में नहीं। – donrondon

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