Java 如何计算该算法的时间复杂度
我编写了一个函数,它获取一个给定的数字,并将其添加到其反面,直到该数字成为回文。我试图计算代码的时间复杂度,但我根本不知道如何做,甚至不知道如何开始。有人能告诉我怎么做吗?另外,这是最有效的方法还是将整数转换为字符串更好Java 如何计算该算法的时间复杂度,java,algorithm,time-complexity,Java,Algorithm,Time Complexity,我编写了一个函数,它获取一个给定的数字,并将其添加到其反面,直到该数字成为回文。我试图计算代码的时间复杂度,但我根本不知道如何做,甚至不知道如何开始。有人能告诉我怎么做吗?另外,这是最有效的方法还是将整数转换为字符串更好 void getPali(int num) { int n = 0; int nNum; while(true) { nNum = num; int rNum = 0;
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++;
}
}
作为输入值num的函数。此代码块:
while (nNum > 0) {
int rem = nNum % 10;
nNum = nNum / 10;
rNum = rNum * 10 + rem;
}
必须执行日志(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))基数10中是否存在时间复杂度是数学中尚未解决的问题。Lychrel数是重复的反转过程和向自身添加数字的过程无法生成回文的数 因为您的代码实现了这个过程,所以无法确定代码的时间复杂度 当然,这假设“int”是无界的,并且不像在真正的java程序中那样环绕,但是时间复杂性对于有界域来说是没有意义的
起点196被推测为不终止。我认为关于外循环执行多少次的争论是基于对代码的误读。这个答案已被接受,但它是错误的。哎呀,我犯了一个错误。我的分析假设该算法将以等于rNum的方式递增num。看来情况并非如此。很明显,这个过程总是终止的吗?对我来说不是。