这个递归程序的内存复杂性是多少?

时间:2014-01-06 02:09:08

标签: python big-o space-complexity

以下代码必须根据给定的单词字典从字符串(没有空格)中识别单独的单词。它试图在每个字符后面放置一个空格,并检查到目前为止的单词是否在字典中,然后尝试形成一个新单词。如果新单词不成功,则尝试扩展前一个单词。你如何计算这样一个程序的内存复杂性?它是指数/因子吗?记忆化对复杂性有影响吗? (假设如果单词在常量时间内在字典中则返回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

1 个答案:

答案 0 :(得分:0)

小记:你从未将有效的单词放入缓存中;你只输入False个字。这是故意的吗?

另外,我相信这段代码会错误地识别字符串" n"作为一个单词,如果你做初始调用函数与字符串" bun"。可能是错的。

您使用的内存量主要取决于字典的大小和缓存的大小。字符串的长度至少与缓存一样大(我相信),所以你只需要担心缓存。

缓存的大小取决于单词的确切结构,因为缓存中存储的内容取决于单词串的结构。

但是,我认为你可以说缓存是字符串的长度(O(n ^ 2))。如果你想象一个字符串,其中句子的每个子字符串都不是一个有效的单词,那么它最终会将句子的每个子字符串添加到缓存中,并且在长度为n的句子中有n ^ 2个子字符串。

希望有所帮助。