以下代码必须根据给定的单词字典从字符串(没有空格)中识别单独的单词。它试图在每个字符后面放置一个空格,并检查到目前为止的单词是否在字典中,然后尝试形成一个新单词。如果新单词不成功,则尝试扩展前一个单词。你如何计算这样一个程序的内存复杂性?它是指数/因子吗?记忆化对复杂性有影响吗? (假设如果单词在常量时间内在字典中则返回is_word())
def word_break(string, dictionary, cache, i = 0):
if i == len(string):
return []
else:
for j in xrange(i+1, len(string)+1):
chunk = string[i:j]
if (i, len(chunk)) in cache:
return cache[(i, len(chunk)]
if is_word(chunk, dictionary):
done = word_break(string, dictionary, cache, j)
if done == False:
cache[(i, len(chunk))] = False
continue
else:
done.insert(0, chunk)
return done
return False
答案 0 :(得分:0)
小记:你从未将有效的单词放入缓存中;你只输入False
个字。这是故意的吗?
另外,我相信这段代码会错误地识别字符串" n"作为一个单词,如果你做初始调用函数与字符串" bun"。可能是错的。
您使用的内存量主要取决于字典的大小和缓存的大小。字符串的长度至少与缓存一样大(我相信),所以你只需要担心缓存。
缓存的大小取决于单词的确切结构,因为缓存中存储的内容取决于单词串的结构。
但是,我认为你可以说缓存是字符串的长度(O(n ^ 2))。如果你想象一个字符串,其中句子的每个子字符串都不是一个有效的单词,那么它最终会将句子的每个子字符串添加到缓存中,并且在长度为n的句子中有n ^ 2个子字符串。
希望有所帮助。