【问题标题】:What is the Time complexity of isPascal() methodisPascal() 方法的时间复杂度是多少
【发布时间】:2021-01-23 16:05:41
【问题描述】:
static int isPascal(int n) {
    int sum = 0;
    int nthVal = 1;
    while (sum < n) {
        sum = sum + nthVal;
        nthVal++;
    }
    return sum == n ? 1 : 0;
}

这里的函数检查给定的数字是不是帕斯卡数。 帕斯卡数是一个数字,它是对于某些 i,从 1 到 i 的整数之和。

例如 6 是帕斯卡数,因为 6 = 1 + 2 + 3

这个函数的时间复杂度是多少?会是 O(logn) 时间吗?如果是这样,这里的日志基础是什么?

【问题讨论】:

    标签: performance function time-complexity


    【解决方案1】:

    如果您考虑计算平方根 O(1) 运算,您可以在 O(1) 中进行此检查,借助前 i 个自然数之和的公式

    sum(i) = (i^2 + i)/2
    

    现在在您的情况下,您不知道i,但您知道sum(i),因为那是您的n,您想检查它是否是帕斯卡数。所以你有

    n = (i^2 + i) /2 
    

    i^2 + i - 2n = 0
    

    用相应的公式求解这个二次方程得到

    i = -1/2 + sqrt(2*n + 1/4)
    

    您可以放弃该方程的第二个解,因为i 必须是&gt; 0 才能成为有效解。如果结果 i 是一个整数,那么 n 是一个帕斯卡数。否则不是。

    从该公式也可以看出,您的迭代解决方案在 O(sqrt(n)) 中

    【讨论】:

    • 在我看来,问题是“我的算法的时间复杂度是多少?”而不是“我怎样才能让这个算法变得更好?”。
    • @ArthurAttout 如果你读了我的最后一句话,你会明白我对 OP 算法复杂性的结论
    • 这是唯一必要的句子,应该放在上面,用粗体字。
    • @ArthurAttout 在建造房屋时,我更喜欢从地基开始,只有在墙壁已经建成时才添加屋顶。而不是先在地上盖屋顶,然后把它放在一边,而墙壁还在建造中。
    • @ArthurAttout 老实说,如果您不喜欢我的回答,请随意投反对票或提出更好的答案。我总是试图以某种方式来回答我的问题,我不只是说“解决方案是 X”,还要解释为什么它是 X 而不是 Z。
    猜你喜欢
    • 2018-01-18
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 2010-12-23
    • 2011-02-16
    • 2019-05-14
    相关资源
    最近更新 更多