Java 求这个递归函数的时间复杂度
这个算法有点胡说八道,因为我把它简化为基本方案 基本上,它接受一个字符串作为输入,扫描这个字符串并创建一个不包含旧字符串第一个字母的新字符串。 那是O(n^2)吗?如果你能证明答案的正确性。多谢各位Java 求这个递归函数的时间复杂度,java,algorithm,time-complexity,Java,Algorithm,Time Complexity,这个算法有点胡说八道,因为我把它简化为基本方案 基本上,它接受一个字符串作为输入,扫描这个字符串并创建一个不包含旧字符串第一个字母的新字符串。 那是O(n^2)吗?如果你能证明答案的正确性。多谢各位 recursiveProc(String myString){ if(myString.length() >= 1){ char firstLetter = myString.charAt(0); String newString = "";
recursiveProc(String myString){
if(myString.length() >= 1){
char firstLetter = myString.charAt(0);
String newString = "";
for(int i = 0; i < myString.length(); i++){
if(myString.charAt(i) != firstLetter){
newString = newString + myString.charAt(i);
}
}
recursiveProc(newString);
}}
recursiveProc(字符串myString){
如果(myString.length()>=1){
char firstLetter=myString.charAt(0);
字符串newString=“”;
对于(int i=0;i
它实际上比O(N^2)更糟糕。看起来像是O(N^3)
每次递归调用都会将输入字符串
减少至少一个字符,因此最多会有N
递归调用(在最坏的情况下,会有N
递归调用,每次将输入字符串
减少正好一个字符)
但是,您的循环采用O(N^2)
,因为它有O(N)
迭代,每次迭代都会创建一个长度不是常数的新字符串
假设您有字符串“0123456789”
第一个递归调用将通过创建以下String
s删除“0”字符:
"1"
"12"
"123"
"1234"
"12345"
"123456"
"1234567"
"12345678"
"123456789"
这需要O(N^2)
时间。这只是第一个递归调用
您可以通过使用StringBuilder
而不是String
串联来创建新的String
来改进它
StringBuilder sb = new StringBuilder(myString.length()-1);
for(int i = 0; i < myString.length(); i++){
if(myString.charAt(i) != firstLetter){
sb.append(myString.charAt(i));
}
}
recursiveProc(sb.toString());
StringBuilder sb=新的StringBuilder(myString.length()-1);
对于(int i=0;i
在这种情况下,循环将采用O(N)
(因为循环的每次迭代都会持续工作),而整个递归将采用O(N^2)
,它实际上比O(N^2)
更糟糕。看起来像是O(N^3)
每次递归调用都会将输入字符串
减少至少一个字符,因此最多会有N
递归调用(在最坏的情况下,会有N
递归调用,每次将输入字符串
减少正好一个字符)
但是,您的循环采用O(N^2)
,因为它有O(N)
迭代,每次迭代都会创建一个长度不是常数的新字符串
假设您有字符串“0123456789”
第一个递归调用将通过创建以下String
s删除“0”字符:
"1"
"12"
"123"
"1234"
"12345"
"123456"
"1234567"
"12345678"
"123456789"
这需要O(N^2)
时间。这只是第一个递归调用
您可以通过使用StringBuilder
而不是String
串联来创建新的String
来改进它
StringBuilder sb = new StringBuilder(myString.length()-1);
for(int i = 0; i < myString.length(); i++){
if(myString.charAt(i) != firstLetter){
sb.append(myString.charAt(i));
}
}
recursiveProc(sb.toString());
StringBuilder sb=新的StringBuilder(myString.length()-1);
对于(int i=0;i
在这种情况下,循环将采用O(N)
(因为循环的每次迭代都会持续工作),整个递归将采用O(N^2)
,您可以采用所有不同字符的最坏情况,因此对于长度为N的字符串,将创建长度为N-1的新字符串。为什么需要recursiveProc(newString);代码>这个递归调用吗?@JoopEggen是的,所以我有n个递归调用,每个递归调用中都有一个n-1循环。那么最后呢?这是我的problem@vivek_23在这种情况下,我不能使用它,但我需要做它的分析is@cieco1109Eran说,假设没有任何字符串操作添加到字符串中,那么这一切都是O(N²)。您可以采用所有不同字符的最坏情况,因此对于长度为N的字符串,将创建长度为N-1的新字符串。为什么需要recursiveProc(newString);
这是递归调用吗?@JoopEggen是的,所以我有n个递归调用,每个递归调用中都有一个n-1循环。那么最后呢?这是我的problem@vivek_23在这种情况下,我不能使用它,但我需要做它的分析is@cieco1109Eran说这一切都是O(N²),假设没有任何字符串操作添加到其中。