首先,这不是作业:我在CodeEval上提交了一些Java代码。
挑战归结为以下问题:
以数字n开头。如果它是回文,请停止。否则,反转n的数字,将它们添加到n,然后重复此过程。报告在数字收敛到回文之前需要多少步骤。
一点也不困难。此外,一旦我提交了代码并收到了100%的挑战,我就开始重新查看我的代码 - 我想确定递归调用方法的时间复杂度以及在递归方法中调用我的方法。
其中,我想出了:
//adds the i'th integer in String[] data to its reversed integer:
private final int add(int x)
{
//if x is 0, then don't do anymore computation
if(x==0)
{
count++;
return x;
}
//if x equals its reversal, the palindrome has been found
if(x==rev(x))
{
return x;
}
//keep adding and reversing
else
{
//if MAX has been reached, STOP
if (count==MAX)
return 0;
//increment the count
count++;
_intTmp=rev(x); //get the reversal
return add(x + _intTmp); //recursive call: keep adding
}//else:end
} //Main::add() end
所以...我计算了T(N):1 + log(1 / n)
//reverse the integer: worst case is O(N)
private final int rev(int orig)
{
int reversed=0;
while(orig>0)
{
//adds the last digit from orig to reversed
reversed=reversed*10+orig%10;
orig=orig/10; //gets rid of the last digit
}
return reversed; //return the reversed integer
}//Main::final end
我计算:O(N)
此代码段的总时间复杂度为:O(1 + log(1 / n)+ n)~O(N)
我是对的,还是我搞砸了?
感谢您的时间和建议......
答案 0 :(得分:0)
我认为没有人知道这个函数的大O运行时是什么,或者它是否甚至有一个。挑战暗示,不知道某些数字是否最终以这种方式形成回文。事实上,它是数学中一个开放的问题;这样的数字称为Lychrel number,没有人知道它们是否存在!
如果存在多个这种形式,你的算法在运行时会进入无限循环,因此在该输入上没有运行时的上限。另一方面,如果不存在此形式的数量,则运行时限制将取决于您必须将数字的反向添加到自身以形成回文的总次数。
但是,现在,让我们假设必然会有迭代次数。让我们假设对于任何数字n,有一个数字f(n)告诉你有多少次你必须使用反向数字和加法技巧。请注意,每次反转数字并添加时,数字最多增加9倍。添加d位数字需要时间O(d),反转d位数字也需要时间O(d)。另请注意,数字n中包含O(log n)个数字。因此,运行时将是
log n + 9 log n + 9 2 log n + ... + 9 f(n) log n
= O(9 f(n) log n)
因此,如果在所需的步骤数上确实存在上限f(n),则运行时将为O(9 f(n) log n)。
我不确定你是如何得到O(1 + 1 / log n)作为主要步骤的运行时间。如果您提供有关如何实现这一目标的更多详细信息,我可以尝试更详细地帮助您查看逻辑。
希望这有帮助!