当前位置: 首页 > 知识库问答 >
问题:

Python代码的时间复杂度和空间复杂度

杜炫明
2023-03-14

有人能帮我了解一下这个代码片段的时间和空间复杂性吗?请参考leetcode问题-单词中断II。给定一个非空字符串s和一个包含非空单词列表的字典单词dict,在s中添加空格来构造一个句子,其中每个单词都是有效的字典单词。返回所有这些可能的句子。

def wordBreak(self, s, wordDict):
    dp = {}
    def word_break(s):
        if s in dp:
            return dp[s]
        result = []
        for w in wordDict:
            if s[:len(w)] == w:
                if len(w) == len(s):
                    result.append(w)
                else:
                    tmp = word_break(s[len(w):])
                    for t in tmp:
                        result.append(w + " " + t)
        dp[s] = result
        return result
    
    return word_break(s)

共有1个答案

陆海阳
2023-03-14

>

  • 对于时间复杂性分析,我们几乎总是考虑最坏的情况。

    我想O(N^3)运行时和O(N)内存是正确的。

    下面是一个细分:

    def wordBreak(self, s, wordDict):
        dp = {}
        def word_break(s):
            # This block would be O(N) 
            if s in dp: # order of N
                return dp[s]
            result = []
    
            # This block would be O(N ^ 2)
            for w in wordDict: # order of N
                if s[:len(w)] == w:
                    if len(w) == len(s):
                        result.append(w)
                    else:
                        tmp = word_break(s[len(w):])
                        for t in tmp: # order of N
                            result.append(w + " " + t)
            dp[s] = result
            return result
        
        return word_break(s) # This'd be O(N) itself
    

    >

  • 因此,第二个块的O(N^2)乘以调用Word_break(s)O(N),最终使其成为O(N^3)

    我们可以将其简化为:

    class Solution:
        def wordBreak(self, s, words):
            dp = [False] * len(s)
            for i in range(len(s)): # order of N
                for word in words:  # order of N
                    k = i - len(word)
                    if word == s[k + 1:i + 1] and (dp[k] or k == -1):  # order of N
                        dp[i] = True
            return dp[-1]
    

    这样会更容易看到:

    • 表示i在值域(len(s)):是n的阶;
      • 表示单词中的单词:是n的阶;
        • 如果word==s[k+1:i+1]和(dp[k]或k==-1):是n的阶;

  •  类似资料:
    • 主要内容:时间复杂度,空间复杂度《 算法是什么》一节提到,解决一个问题的算法可能有多种,这种情况下,我们就必须对这些算法进行取舍,从中挑选出一个“最好”的。 算法本身是不分“好坏”的,所谓“最好”的算法,指的是最适合当前场景的算法。挑选算法时,主要考虑以下两方面因素: 执行效率:根据算法所编写的程序,执行时间越短,执行效率就越高; 占用的内存空间:不同算法编写出的程序,运行时占用的内存空间也不相同。如果实际场景中仅能使用少量的内

    • 所以我在理解为什么递归DFS和迭代DFS的时间复杂度相同时遇到了一些问题,也许有人能给我一个简单的解释? 提前谢了。

    • 例如,我有点混淆这两个术语——合并排序、heapsort和插入排序的辅助空间是O(1),而合并排序、插入排序和heapsort的空间复杂度是O(n)。 所以,如果有人问我合并排序、堆排序或插入排序的空间复杂度是多少,我应该告诉他们O(1)还是O(n)? 另外,请注意,在选择排序的情况下,我已经阅读了它的空间复杂度是 O(1),这是辅助空间。 那么,使用“就地计算”的算法是否有可能,对于这些算法,我

    • 算法的时间与空间复杂度 看到群里们小伙伴在讨论算法复杂度问题,之前在极客时间看了王争的《数据结构与算法之美》,看的我也晕呼呼的,跟上学时在学校老师的讲的有点不一样了,网上搜了下各种各样的,结合参考作一篇简单易懂的总结。 什么是算法 算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。 如何评价一个算法的好坏 一般我们会从以下维度来评估算法的优劣 正确性

    • 让我们以合并排序的实现为例 a) 这种合并排序的时间复杂度是。并行化(1)和(2)会带来实际收益吗?从理论上讲,在对它们进行并行化之后,似乎最终也会出现。但实际上我们能得到什么好处吗? b) 这种合并排序的空间复杂度是。但是,如果我选择使用链表执行就地合并排序(不确定是否可以合理地使用数组),空间复杂性是否会变得,因为您必须考虑递归堆栈帧大小?既然它不能超过64,我们能把当作常数吗?我可能在几个地

    • 我正在尝试分析一个算法的时间复杂度。 下面的算法旨在只检查数组的一部分,所以如果它没有多大意义,请不要担心。 我对计算循环周围的时间复杂度很困惑,请看看我的评论。 这是否意味着我们有: T(N) = (C2 C4 C5)N (C1 C3 C6) T(N) = C7*N (C8) T(N)=N?? 循环中的所有内容都是*N? 先谢谢!