【发布时间】: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 dev、cumulative distribution function 等。
-
这实际上是一个非常好的主意。我想这将涉及一些我必须补充的组合学知识。你知道统计分析方法会涉及什么吗?
-
我也必须修改它。因此,我没有回答,只是评论。 :)
-
...我有一个包含所有 0 的列表...然后...生成一个介于 0 和 9 之间的随机整数...如果列表中的值位于随机数为 0,然后将值写入 1 并退出 while 循环... 由于列表开始时全为 0,这意味着第一次通过,无论您生成什么索引,该值在那个索引为零并且循环退出。
标签: random time-complexity big-o