शब्दकोश में आपके द्वारा दिए गए शब्दों में से trie बनाएं, जो तेजी से खोज करेगा। अपनी इनपुट स्ट्रिंग के निम्न अक्षरों के अनुसार पेड़ को खोजें। जब आपको एक शब्द मिल गया है, जो पेड़ में है, इनपुट स्ट्रिंग में उस शब्द के बाद स्थिति से रिकर्सिव से शुरू होता है। यदि आप इनपुट स्ट्रिंग के अंत तक पहुंच जाते हैं, तो आपको एक संभावित विखंडन मिल गया है। अगर आप अटक गए हैं, तो वापस आएं और दोबारा शब्दों का प्रयास करें।
संपादित करें: क्षमा करें, इस तथ्य को याद किया, कि केवल दो शब्द होना चाहिए। इस मामले में, करने के लिए 2.
प्रत्यावर्तन गहराई की सीमा 2 शब्दों के लिए स्यूडोकोड होगा:
T = trie of words in the dictionary
for every word in T, which can be found going down the tree by choosing the next letter of the input string each time we move to the child:
p <- length(word)
if T contains input_string[p:length(intput_string)]:
return true
return false
(मान लें कि आप O(1)
में trie में एक बच्चे नोड के लिए नीचे जा सकता है बच्चों की ascii अनुक्रमित), आप इनपुट स्ट्रिंग के सभी उपसर्ग O(n+p)
में पा सकते हैं, जहां p
उपसर्गों की संख्या है, और इनपुट की लंबाई n
है। इस पर ऊपरी सीमा O(n+m)
है, जहां m
शब्दकोश में शब्दों की संख्या है। युक्त के लिए जांच O(w)
ले जाएगी जहां w
शब्द की लंबाई है, जिसके लिए ऊपरी सीमा m
होगी, इसलिए एल्गोरिदम की समय जटिलता O(nm)
है, क्योंकि O(n)
सभी पाए गए शब्दों के बीच पहले चरण में वितरित की जाती है।
लेकिन क्योंकि हम पहले चरण में n
शब्दों से अधिक नहीं पा रहे हैं, जटिलता भी O(n^2)
तक सीमित है। तो खोज जटिलता O(n*min(n, m))
इससे पहले कि आपको ट्राई बनाने की आवश्यकता है जो O(s)
ले जाएगा, जहां s
शब्दकोश में शब्दों की लंबाई का योग है। इस पर ऊपरी सीमा O(n*m)
है, क्योंकि प्रत्येक शब्द की अधिकतम लंबाई n
है।
स्रोत
2013-03-06 07:28:13
मुझे लगता है कि वह दोनों के लिए पूछ रहा है। – Blizzer