Aramayla ilgili daha hızlı arama yapacak sözcüklerin bir trie oluşturun. Ağacınızı giriş dizenizin şu harflerine göre arayın. Ağaçta bulunan bir kelime bulduğunuzda, giriş dizesinde bu kelimeden sonraki konuma yinelemeli olarak başlayabilirsiniz. Giriş dizesinin sonuna gelirseniz, olası bir parçalanma buldunuz. Eğer sıkışmış olsaydınız, geri dönün ve tekrar tekrar başka kelimeler deneyin.
DÜZENLEME: özür dilerim, gerçeği kaçırdı, sadece iki kelime olmalı.
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
(sen O(1)
yılında tray içerisinde bir çocuk düğüme aşağı gidebilir çocukların ASCII endeksleri varsayarsak: Bu durumda , 2 kelime yalancı kod olurdu 2.
için yineleme derinliğini sınırlamak), giriş dizesinin tüm öneklerini O(n+p)
adresinde bulabilirsiniz; burada p
öneklerin sayısıdır ve girişin uzunluğu n
. Üst sınırda bu O(n+m)
, burada m
sözlükteki sözcük sayısıdır. İçermek için denetleme, w
'un, m
olacağı sözcük uzunluğu olan O(w)
alacaktır, bu nedenle, , tüm bulunan sözcüklerin arasındaki ilk aşamada dağıtıldığı için algoritmanın zaman karmaşıklığı O(nm)
olur.
Ancak ilk aşamada n
sözcükten daha fazlasını bulamadığımız için, karmaşıklık da O(n^2)
ile sınırlıdır. Dolayısıyla, arama karmaşıklığı O(n*min(n, m))
olacaktır. Bundan önce O(s)
değerini alacağınız trie'yi oluşturmalısınız, burada s
sözlükteki sözcüklerin toplamıdır. Bunun üst sınırı, her kelimenin maksimum uzunluğu n
olduğundan O(n*m)
dur.
istiyorsanız daha iyi uygulayabilir. – Blizzer