我是复杂性分析新手。任务是给定一个非空字符串(如“Code”)返回一个字符串(如“CCoCodCode”)。我有两个程序在做同样的事情。
程序1:
public String stringSplosion(String str) {
String result = "";
for (int i=0; i<str.length(); i++) {
for(int j=0;j<=i;j++)
result += str.charAt(j);
}
return result;
}
所以,上面的一个非常简单,这个程序有O(n^2)复杂度。
程序2:
public String stringSplosion(String str) {
String result = "";
// On each iteration, add the substring of the chars 0..i
for (int i=0; i<str.length(); i++) {
result = result + str.substring(0, i+1);
}
return result;
}
从另一个StackOverflow问题来看,str.substring()
的时间复杂度似乎为O(n)。在这种情况下,程序2也具有O(n^2)时间复杂度。
我的分析是正确的还是遗漏了什么?
请原谅缩进,但这本质上是一个满足测试的解决方案。
public String stringSplosion(String str) {
// Empty String test
if (str.length() == 0)
return str;
StringBuilder sb = new StringBuilder();
for (int i=0; i<=str.length() ; i++) {
sb.append(str.substring(0,i));
}
return sb.toString();
}
事实上,两者都有相同的复杂性-O(n^3)
。这是因为您使用的是串联答案!这里有一个隐藏的循环,你没有解释,这是画家施莱米尔算法的一个经典例子。您应该使用StringBuilder,这是一种在运行时构建字符串的正确方法。
如果我通过两个嵌套的For循环进行输入 外环的复杂度是O(X),但是我对内环的时间复杂度感到困惑,因为Y是可变的。
有一个循环执行蛮力算法来计算5*3,而不使用算术运算符。 我只需要加5 3次,这样它就需要O(3),如果输入是x*y,它就是O(y)。但是,在一本书中,它说它需要O(2^n),其中n是输入中的位数。我不明白为什么它用O(2^n)来表示它O(y)。这是显示时间复杂度的更好方法吗?。你能解释一下吗? 我没有要求其他算法来计算这个。
我在一个非常受欢迎的网站上看了一篇关于循环时间复杂度分析的文章(链接如下),根据这篇文章,第一和第二个循环的时间复杂度分别是O(1)和O(n)。但是我认为两个循环的时间复杂度是相同的O(n) 我的推理是:`c*n=O(n) 看完下面的答案后,我的推理是错误的,因为没有变化的输入n。循环运行是固定的-c次。因此,无论输入值n是多少,循环都将以恒定时间运行。so(1)复杂性 我的推理: 我错过什么了吗
帮助我减少这个程序的时间复杂性 输出:为每个测试用例输出这样的对的数量。 约束条件:T≤10;N≤100000;A[i]≤1000000 示例输入(明文链接)
所以,基本上,我想找到第二个数组中的所有元素,它们小于或等于第一个数组的元素。这两个数组都是排序的。我知道解决办法。我不想那样。我只想知道这个程序的时间复杂度,以及我们将如何计算。提前谢谢你。