实施更高效的算法执行速度较慢

时间:2018-10-29 11:07:50

标签: java runtime

我是新来的,如果我的问题不相关,请删除它。在解决LeetCode上的以下问题时,我有一个疑问:

  

70-爬楼梯:   您正在爬楼梯。需要N步才能到达顶部。   每次您可以爬1或2步。您可以通过几种不同的方式攀登顶端?

     

注意:给定n将是一个正整数。

示例1:

  • 输入:2
  • 输出:2

说明:有两种爬上顶部的方法。

  1. 一步然后另一步

  2. 一次两个步骤

我知道此问题的两种解决方案:

  • 一个在每一步中计算所有可能的步长组合的人:

    public class Solution {
        public int climbStairs(int n) {
            climb_Stairs(0, n);
        }
        public int climb_Stairs(int i, int n) {
            if (i > n) {
                return 0;
            }
            if (i == n) {
                return 1;
            }
            return climb_Stairs(i + 1, n) + climb_Stairs(i + 2, n);
        }
    }
    
  • 和另一个使用动态编程的人:

    public class Solution {
        public int climbStairs(int n) {
            if (n == 1) {
                return 1;
            }
            int[] dp = new int[n + 1];
            dp[1] = 1;
            dp[2] = 2;
            for (int i = 3; i <= n; i++) {
                dp[i] = dp[i - 1] + dp[i - 2];
            }
            return dp[n];
        }
    }
    

很明显,第二个要比第一个更有效。但是,当我提交它们时,LeetCode显示的运行时间几乎相同,大约为4ms。第二个运行时间是否应该比第一个运行时间短得多?

1 个答案:

答案 0 :(得分:0)

我用不同的步数测试了您的实现。代码位于答案的结尾。

  • 对于{strong> 3 个步骤,n = 3,我得到了以下输出:

    Time spent for 3 step(s):
         - climbStairsByComputingAllNextSteps(): 6243 nanoseconds
         - climbStairsDynamically(): 25236 nanoseconds
    

哦,效率越高,速度越慢?好吧,让我们再做一个测试:

  • 对于{strong> 20 个步骤,n = 20,我得到了以下输出:

    Time spent for 20 step(s):
         - climbStairsByComputingAllNextSteps(): 1048360 nanoseconds
         - climbStairsDynamically(): 5657 nanoseconds
    

因此,实现的效率取决于 n

当然,您的算法 time complexity 效率有很大的影响(很抱歉,如果与字词)。但是,对于两种给定的算法,一种可能对 n < nmax value 而言更高有效,然后对于 { {1}}

看看这张摘自Wikipedia的图表(作者:Cmglee-许可证CC BY-SA 4.0,摘自上面链接的文章):

Comparison computational complexity by Cmglee - CC BY-SA 4.0

n >= nmax nlog 2 的曲线似乎比 n ,一个,,除了0附近的 n 。这个社区可能会有所不同。在这里,他们的效率切换点似乎是 (0 <= n < ~1)

在我使用的工作示例下面(尝试Online Java Compiler)。

n=6
相关问题