Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 无限循环的大O?_Algorithm_Time Complexity_Big O - Fatal编程技术网

Algorithm 无限循环的大O?

Algorithm 无限循环的大O?,algorithm,time-complexity,big-o,Algorithm,Time Complexity,Big O,考虑以下代码: int value = 0; while(getRandomNumber() != 1000) { value++; } return value; 上述代码的大O(最坏情况、最佳情况和平均情况)是什么?如果某个语句在整个循环期间都是假的,那么,是的,循环是无限的,并且具有O(无限)复杂性。 然而,一旦某个_语句变为真,循环就变为有限循环。如果某个语句开始时为真,则它甚至可以是O(1)-常量。当谈到复杂性时,n是以位为单位的输入大小。这里没有输入。所以n是固定的,等

考虑以下代码:

int value = 0;

while(getRandomNumber() != 1000) {
    value++;
}

return value;

上述代码的大O(最坏情况、最佳情况和平均情况)是什么?

如果
某个语句在整个循环期间都是假的,那么,是的,循环是无限的,并且具有O(无限)复杂性。

然而,一旦
某个_语句
变为真,循环就变为有限循环。如果
某个语句开始时为真,则它甚至可以是O(1)-常量。

当谈到复杂性时,
n
是以位为单位的输入大小。这里没有输入。所以
n
是固定的,等于
0
。因此从技术上讲,没有复杂性,因为输入大小不能有任何变化

但是,您可以问这样的问题:循环平均执行多少次,最大执行次数还是最小执行次数

  • 最坏的情况是
    O(∞)
    ,最好的情况是
    0(1)

  • 是的,但是每个算法都有复杂性
    O(∞),因此它不是非常有用的信息


  • 您需要的是预期的时间复杂度。在您的特定情况下,这是预期的时间复杂度值(平均值)

    例如,循环的预期迭代次数如下所示:

    E[iterations] = (1 - p) / p
    
    其中
    p
    是精确获得1000的概率

    p = P(X=1000)
    

    你这里的问题没有什么意义。首先,大O符号取决于输入,这里根本没有输入到你的算法中

    此处的执行时间取决于
    getRandomNumber
    的一组可能值及其基础分布


    例如,如果您的RNG从
    [1到100]返回数字
    -该算法永远不会完成。另一方面,如果它以相同的概率仅生成
    1000
    1001
    ,则平均需要2次迭代才能完成。最糟糕的情况是无穷大,但它根本没有任何意义,因为这是不太可能的。

    摘要

    其他人指出了好的信息,但没有解决一些非常重要的问题。一旦引入随机化,您希望看到的是预期时间,而不是确定性分析。要回答您的问题:

    • 最佳情况:
      Ω(1)
    • 更糟的情况:
      O(∞)
    • 平均情况:见下文预期分析
    最佳案例注释

    注意最好的情况是它是大的欧米茄,而不是大的O()

    预期分析

    一旦引入随机化,你就不再依赖确定性分析。相反,你开始处理“预期分析”。正如Mateen指出的,你的实例可以用几何分布来解决。因为我不知道get random number函数可以返回的值的范围(也不知道数的分布),我们不能直接回答你的问题。Mateen的分析看起来不错,因为他没有假设你得到1000的可能性

    旁注

    对于其他类型的随机问题,您可以使用其他工具,例如Marchov Chains()。我在随机在线算法分析()中见过类似的工具,如果您对此感兴趣,那么这些链接应该为您提供大量其他链接供您阅读


    随机化的引入为算法分析增加了一种新的乐趣。希望这能有所帮助,并且玩得开心:)

    高度依赖于
    某些语句
    。如果某些语句在循环中不能/不会改变,那么是的,整个事情是O(无限的)将随机化添加到算法中会将其分析从确定性方法更改为预期方法。在下面的回答中提供了更多详细信息。谢谢。我编辑了代码。现在if语句取决于在循环中确定的随机数,并且返回语句的执行是不可预测的。现在会有什么结果?什么什么样的随机数?它是真/假的概率有多大?你需要最坏情况的复杂度还是平均情况?让我们假设随机数是不可预测的。因此,条件可以随时为真,但条件可能永远不为真。我需要最坏情况的复杂度。我认为不可能有平均c但我想知道这是否可能。最坏的情况是,条件永远不会变为真,所以你的循环确实是无限的,即O(无穷大).你是对的,如果没有准确的数字来说明这句话是真的,你就不可能有一个平均的例子。谢谢。如果我问循环的最大执行次数是多少,它会是O吗(∞)?它实际上取决于你的随机生成器:)如果它不生成1000,它可能是无限的,或者如果它总是返回1000,它可能是一个单一的迭代…@user2726225你把它插入公式
    E[iterations]=(1-p)/p
    其中
    p=1/numberOfPossibleOutcomes
    这与生日无关problem@SalvadorDali是的,我把它和散列冲突混淆了。这可能没有任何意义,但我在过去的一周里每天只睡6个小时……因为它不依赖于输入n的大小,这是否意味着无限循环是恒定的而O(1)?@Alswigart根据定义,无限循环取决于n的大小,无论n有多大,循环所需的时间都超过O(n),O(n^2),O(n!),O(n^n)