有人能帮我了解一下这个代码片段的时间和空间复杂性吗?请参考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)
>
对于时间复杂性分析,我们几乎总是考虑最坏的情况。
我想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? 先谢谢!