函数的时间复杂度是多少?
Posted
技术标签:
【中文标题】函数的时间复杂度是多少?【英文标题】:What will be the time complexity of the function? 【发布时间】:2020-07-06 13:53:56 【问题描述】:今天我正在解决断词问题,但我无法计算实施解决方案的时间复杂度。
这是一个问题:- https://practice.geeksforgeeks.org/problems/word-break-part-2/0/
我们必须从测试用例提供的字典中包含的单词中找到并打印由给定字符串组成的每个句子。
示例:- string = "snakesandladder", dictionary = ["snake", "snakes", "and", "sand", "ladder"]。
一个解决方案是[“蛇和梯”,“蛇沙梯”]。
我实现的功能:-
set<vector<string>> res; `//stores all the sentences`
vector<string> v; `//stores all the words in a sentence`
helper(s, st, 0); `//function call`
void helper(string& s, unordered_set<string>& st, int i)
`//string s is the string and unordered_set<string> st is the dictionary.`
if(i == s.size())
res.insert(v);
return;
string temp = "";
for(int k = i ; k < s.size() ; k++)
temp += s[k];
if(st.find(temp) != st.end())
v.push_back(temp);
helper(s, st, k+1);
v.pop_back(); `//Backtracking to find more solution`
我的计算表明时间复杂度应该是 O(n^n)。
【问题讨论】:
你为什么认为是n^n
?
helper
的复杂度是s
的大小和st
的大小的函数。在最坏的情况下,您会在s
中找到st
的所有字词。
@ChrisMM for
循环将运行n
次(即字符串的长度)进行一次调用,每次在哈希表中成功查找后,我们将再次继续此过程对于剩余的字符串(即来自 k+1)。在最坏的情况下,我们将在字典中找到1 to n
子字符串的长度。 (这是我的想法)
@Botje 请原谅我,但我没有得到你。但我认为“在最坏的情况下,你会在s
中找到st
的所有单词”这将导致O(n^n)
。
【参考方案1】:
查看算法,最坏的情况类似于 IIII 试图在数组中找到组合:I, I , I, I 这意味着你从 I 开始,然后你得到三个 I 来检查所以第一个需要 7 第二个需要 7,所有这些都需要 7,所以考虑一下你的问题,在最坏的情况下是 (2n-1)*n,所以在这种情况下,n 是 4如果你想要大 O 表示法,我们需要 28 次计算,你会去 O(n^2) 不知道你是如何得到 N^N 的......这是一个真正巨大的数字,只是说这令人惊讶......
【讨论】:
在回溯中,我们尝试了每一个可用的组合,这里也发生了同样的情况,因为解决方案是使用回溯算法。所以,每一个组合都会产生n^n
,这就是我得到上限的方式。
看来你在做一些多余的事情......以上是关于函数的时间复杂度是多少?的主要内容,如果未能解决你的问题,请参考以下文章
从集合构造 PriorityQueue 的时间复杂度是多少?