确定时间复杂度的算法

时间:2017-08-03 20:37:27

标签: ruby algorithm recursion time-complexity space-complexity

对于以下算法:

Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, determine if s can be segmented into a space-separated sequence of one or more dictionary words. You may assume the dictionary does not contain duplicate words

For example, given
s = "leetcode",
dict = ["leet", "code"].

Return true because "leetcode" can be segmented as "leet code".

我写了以下代码:

def word_break(s, word_dict)
    can_break?(s, word_dict, memo = {})
end

def can_break?(s, word_dict, memo)
    return true if s.empty?
    (0...s.length).each do |index|
        string_to_pass = s[index + 1...s.length]
        memo[string_to_pass] ||= can_break?(string_to_pass, word_dict, memo)
        return true if word_dict.include?(s[0..index]) && memo[string_to_pass]
    end
    false
end

我对这里的分析的理解是,我们有递归调用的数量与输入字符串大小线性缩放(因为我们使用memoization减少了递归调用的数量),并且每个递归调用N都工作(扫描通过数组)。这是评估O(N ^ 2)时间和O(N)空间吗? (请注意字典是数组,而不是哈希)

1 个答案:

答案 0 :(得分:0)

这是对理由的一个很好的总结;是的,你是对的。 从理论的角度来看,通过记忆,每个角色都需要作为m扫描的起点,其中m是到角色较近端的距离。您可以应用各种标量级优化,但复杂性仍然 O (N ^ 2)