Java 反向然后添加序列:我的解决方案的Big-O运行时?

Java 反向然后添加序列:我的解决方案的Big-O运行时?,java,math,big-o,time-complexity,recurrence,Java,Math,Big O,Time Complexity,Recurrence,首先,这不是家庭作业:我在CodeEval上提交了一些Java代码 挑战归结为以下问题: 从一个数字开始。如果是回文,请停止。否则,颠倒n的数字,将其添加到n,然后重复此过程。报告在数字收敛到回文之前需要多少步骤 这一点都不难。此外,一旦我提交了代码并收到了100%的挑战,我就开始重新检查我的代码——我想确定递归调用方法的时间复杂度以及在递归方法中调用的方法的时间复杂度 其中,我提出: //adds the i'th integer in String[] data to its reverse

首先,这不是家庭作业:我在CodeEval上提交了一些Java代码

挑战归结为以下问题:

从一个数字开始。如果是回文,请停止。否则,颠倒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
所以。。。I计算T(N):1+对数(1/N)

I计算:O(N)

此代码片段的总体时间复杂度为:O(1+log(1/n)+n)~O(n)

我是对的,还是我在什么地方搞砸了


感谢您的时间和建议…

我想没有人知道这个函数的big-O运行时是什么,或者它是否有运行时。这项挑战暗示我们不知道某些数字是否最终会以这种方式形成回文。事实上,这是数学中的一个开放性问题;这样一个数字叫做a,没有人知道它们是否存在

如果此表单中存在多个表单,那么当在其上运行时,您的算法将进入无限循环,因此该输入上的运行时将没有上限。另一方面,如果不存在此表单的数字,则运行时绑定将取决于您必须将数字的倒数添加到自身以形成回文的总次数

但是,现在,让我们假设所需的迭代次数是有界的。让我们假设,对于任何数字n,有一个数字f(n),它告诉你需要使用多少次数字的倒数和添加技巧。请注意,每次颠倒数字并添加时,数字最多会增加9倍。添加d位数字需要时间O(d),反转d位数字也需要时间O(d)。另外,请注意,数字n中有O(logn)位。因此,运行时将是

日志n+9日志n+92日志n+…+9f(n)对数n

=O(9f(n)对数n)

因此,如果所需的步数确实有一个上界f(n),那么运行时将是O(9f(n)log n)

我不确定您是如何将O(1+1/logn)作为主要步骤的运行时的。如果你能提供更多关于你是如何做到这一点的细节,我可以试着帮助你更详细地审视你的逻辑


希望这有帮助

为什么需要单独的add函数?在反转数字后,您可以直接添加这些数字?为什么要调用rev两次?为什么不在顶部存储rev(x)一次,并在基本情况和递归步骤中使用它呢?此外,您的基本情况条件也可以折叠为一个I感谢您的输入。这是我第一次参加挑战赛的概念验证项目。当然,几天后,我通常会回来,优化和修改代码。你们都做了很棒的观察,但是,计算出的时间复杂度呢?即使我将rev()中的所有内容都集成到add()中,也不会对时间复杂度造成太大的改变。但是,调用rev()一次而不是两次将消除重复处理,并优化代码。归根结底,它归结为几件事:个人风格;代码可读性;设计模式和;可移植性。我不确定我是否理解日志(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