如何计算此算法的时间复杂度

时间:2015-01-24 00:50:38

标签: java algorithm time-complexity

我编写了一个获取给定数字的函数,并将其添加到反向,直到数字为回文。我试图计算代码的时间复杂度,但我根本不知道该怎么做,甚至不知道如何开始。有人能告诉我怎么做吗?另外,这是最有效的方法吗?或者将整数转换为字符串更好吗?

void getPali(int num) {        
    int n = 0;
    int nNum;
    while(true) {
        nNum = num;
        int rNum = 0;            
        while (nNum > 0) {
            int rem = nNum % 10;                
            nNum = nNum / 10;                 
            rNum = rNum * 10 + rem;                
        }
        if(rNum == num) break;
        num += rNum;              
        n++;
    }
}

2 个答案:

答案 0 :(得分:2)

数学中是否存在未解决的问题,是否在基数10中存在Lychrel numbers。Lychrel数是反向和向自身添加数字的重复过程无法产生回文的数字。

由于您的代码实现了此过程,因此无法确定代码的时间复杂度。

当然,这假设“int”是无界的,并不像在真正的java程序中那样环绕,但时间复杂性对于有界域无论如何都是没有意义的。

猜测起点196不会终止。

答案 1 :(得分:1)

好吧,作为输入值num的函数。这段代码:

while (nNum > 0) {
    int rem = nNum % 10;                
    nNum = nNum / 10;                 
    rNum = rNum * 10 + rem;                
}

必须执行log(n)次。这是因为每次通过这个循环都会使nNum减少10倍。因此,对于数字2 ^ 10,循环需要10次迭代才能完成。此外,由于nNum在每个循环开始时被重置为n,因此每次循环时此循环将花费相同的时间。

然后循环的下一部分是

if(rNum == num) break;
num += rNum;              
n++;

这实际上是循环条件,但它是以奇怪的方式编写的。较大的循环将执行,直到rNum = num。所以问题是rNum增加的速度有多快。答案是rNum每次通过大循环时增加10倍,因此要达到num,它将再次花费lg(n)时间。

因此,组合时间复杂度为log(n)^ 2。因为外循环执行log(n)次,内循环执行log(n)次。因此,时间复杂度是log(n)^ 2(或log ^ 2(n))