Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 求这个递归函数的时间复杂度_Java_Algorithm_Time Complexity - Fatal编程技术网

Java 求这个递归函数的时间复杂度

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 = "";

这个算法有点胡说八道,因为我把它简化为基本方案

基本上,它接受一个字符串作为输入,扫描这个字符串并创建一个不包含旧字符串第一个字母的新字符串。 那是O(n^2)吗?如果你能证明答案的正确性。多谢各位

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²),假设没有任何字符串操作添加到其中。