【问题标题】:Big-O of while loop with an indeterminate number of iterations具有不确定迭代次数的 while 循环的 Big-O
【发布时间】:2022-01-16 22:21:07
【问题描述】:

对于迭代次数不确定的 while 循环,我似乎无法合理化 Big-O 表示法。

在我的个人项目代码中,我有一个包含所有 0 的列表。然后我实现了一个 while 循环,它将生成一个介于 0 和 9 之间的随机整数。如果随机数索引处的列表中的值为 0,则将该值写入 1 并退出 while 循环。否则,再次生成一个随机数并重复该过程。

不过,我不完全确定这样做的时间复杂度是多少。例如,如果在算法的 9 次迭代之后,列表中除索引 9 之外的每个值都是 1,并且如果随机数生成器恰好在 99 次迭代中没有生成数字 9,那么它将在 99 次之后退出+ 9 次迭代。最坏的情况不会是 O(infinity) 吗?我不认为这是可能的,但我想我会问,因为我不确定。

我的教科书和在线资源似乎没有提供关于此类示例的太多见解。我确信最好的情况是 O(1),但我有点不确定平均情况和最坏情况。


我发现了一个具有相同前提的类似问题。这是伪代码,其中 n 是任意大小的整数:

sample_found = false
while(!sample_found) {
    if (rand(0,n) == 0) {
        sample_found = true
    }
}

在最坏的情况下,这将无限运行,对吗?我也不确定平均情况。

【问题讨论】:

  • Big-O 并不是分析非确定性算法的最佳工具。它没有考虑到最坏情况结果的可能性越来越小。我会从概率/统计的角度来看待它,看看expected 迭代次数、variance/std devcumulative distribution function 等。
  • 这实际上是一个非常好的主意。我想这将涉及一些我必须补充的组合学知识。你知道统计分析方法会涉及什么吗?
  • 我也必须修改它。因此,我没有回答,只是评论。 :)
  • ...我有一个包含所有 0 的列表...然后...生成一个介于 0 和 9 之间的随机整数...如果列表中的值位于随机数为 0,然后将值写入 1 并退出 while 循环... 由于列表开始时全为 0,这意味着第一次通过,无论您生成什么索引,该值在那个索引为零并且循环退出。

标签: random time-complexity big-o


【解决方案1】:

听起来您正在使用IID Bernoulli trials 来控制循环,并有可能继续使用p=0.1。假设是这种情况,您可以使用Geometric distribution

这个分布的平均值只是1/p,所以是10,我会使用quantiles 来进一步了解需要多少次抽奖才能完成。例如:

  • 10% 的时间您希望立即完成
  • 50% 的运行需要循环 6 次或更少
  • 90% 的运行完成 21 个循环
  • 99% 的运行完成 43 个循环

在 R 中计算,使用 qgeom(c(0.1, 0.5, 0.9, 0.99), 0.1)

最坏的情况显然是无穷大,但实际上你不太可能循环 200 次。 1-pgeom(200, 0.1) 给出 6e-10,因此您可以预期循环迭代超过 10 亿次,然后才需要等待这么多次迭代。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 2015-03-23
    • 1970-01-01
    相关资源
    最近更新 更多