【问题标题】:What is the complexity of these three algorithms?这三种算法的复杂度是多少?
【发布时间】:2019-09-16 15:31:10
【问题描述】:

我星期四有一个关于数据结构和算法的考试,去年的考试中有一个考试题,你必须确定用 java 编写的三种算法的复杂性。 你能帮我解决这些算法吗,也许对你的解决方案有一个非常棒的解释。谢谢!

我的解决方案是:

AlgorithmOne:n*log(n) 第一个循环将以 O(n) 运行,第二个循环以 log(n) 运行,因为计数器变量在每次迭代中加倍。

AlgorithmTwo:不编译,如果不使用标准 java 编译器编译它并不重要。由于 return 语句,它在 O(1) 中,因为这将在 1 次迭代后结束算法。

算法三:for循环的复杂度是n,因为i++和n/2会变成n,递归的复杂度是O(n),因为它会被执行n次。总结 algorithmThree 的复杂度应该是 O(n),因为递归函数没有和循环相连。

int algorithmOne(int n){
    int sum = 0;
    for(int i = 0; i < n/2; i++){
        for(int j = 1; j <= n/4; j= j *2){
            sum++;
        }
    }
    return sum;
}

int algorithmTwo(int n){
    int sum = 0;
    for(int i = 0; i < n/2; i++){
        for(int j = n; j > 1; j = j/2){
            sum++;
            return sum;
        }
    }
}

int algorithmThree(int n){
    int sum = 0;
    if(n>1){
        sum = algorithmThree(n-1)+1;
    }
    else{ 
        sum = 1;
    }
    for(int i=0; i < n/2; i++){
        sum = sum-1;
    }
    return sum;
}

【问题讨论】:

  • 再看看三。

标签: java time-complexity complexity-theory


【解决方案1】:

正如您分析的那样,前两个是正确的。 但是对于第三个,你需要再看一遍这个递归调用,

    if(n>1){
        sum = algorithmThree(n-1)+1;
    }

只要 n>1,它就会被执行。 而当它到达基本条件即n=1时,for循环将运行n/2次,然后返回之前的递归调用,然后再次重复,这样使总复杂度为 O(n*n)。

【讨论】:

  • @Felix 不客气。另外,不要忘记,如果一个答案能令人满意地解决您的问题,您可以接受它。
猜你喜欢
  • 2017-03-27
  • 2023-03-07
  • 2017-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多