algorithm - 依赖随机结果终止的算法的最坏情况时间复杂度?

标签 algorithm time-complexity complexity-theory asymptotic-complexity

假设我们有一个递归函数,它仅在随机生成的参数满足某些条件时才终止:

例如:

{
define (some-recursive-function)

    x = (random in range of 1 to 100000);
    if (x == 10)
    {
        return "this function has terminated";
    }
    else
    {
        (some-recursive-function)
    }
}

我知道对于无限循环,不会定义复杂性。一些肯定终止但在未知时间后终止的函数呢?

为此找到平均时间复杂度就可以了。如果存在的话,人们将如何找到最坏情况下的时间复杂度?

提前致谢!

编辑:正如一些人所指出的,我完全忽略了这个函数没有输入的事实。相反,假设我们有:

{define (some-recursive-function n)

    x = (random in range of 1 to n);
    if (x == 10)
    {
        return "this function has terminated";
    }
    else
    {
        (some-recursive-function)
    }
}

这会改变什么吗?

最佳答案

如果没有 n 的函数从上面限制函数的运行时间,那么就没有运行时间的上限。视情况而定,运行时间可能有下限。我们还可以谈论预期的运行时间,甚至对预期的运行时间设置界限,但这一方面不同于平均情况的界限,另一方面不同于运行时间本身的界限。

正如目前所写的那样,当 n 小于 10 时根本没有界限:该函数在任何情况下都不会终止。对于 n >= 10,在任何情况下仍然没有上限 - 它可能需要任意长的时间才能完成 - 但在任何情况下下限都低至线性(您必须至少读取 n 的值,它由 N = ceiling(log n) 位组成;您选择不大于 n 的随机数的方法可能需要额外的时间和/或空间)。这里的案例行为相当无趣。

如果我们根据输入的值(而非长度)考虑函数的预期运行时间,我们会观察到任何特定调用都有 1/n 的机会选择正确的随机数(同样,对于 n > = 10);我们认识到,我们需要尝试获得一个的次数由几何分布给出,并且期望为 1/(1/n) = n。因此,预期的递归深度是输入值 n 的线性函数,因此是输入大小的指数函数 N = log n。我们恢复了期望的精确表达式;因此,上限和下限也是线性的,这涵盖了所有情况(最好、最差、平均等)。我说递归深度,因为运行时还有一个额外的因素 N = log n,或更多,由于上一段中的观察。

关于algorithm - 依赖随机结果终止的算法的最坏情况时间复杂度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46962601/

相关文章:

arrays - 在线性时间中将两个离散随机变量相加的概率质量

c# - 设计面向对象和单元测试友好的查询系统

regex - 正则表达式生成器/缩减器?

algorithm - 使用不同算法的凸包

java - 用于 Java 中 switch 的 McCabe Cyclomatic Complexity

c - 将数组初始化为 0 需要多长时间?

list - Data.map 中 haskell 列表的复杂性

c++ - std::transform 中未解析的重载函数类型

algorithm - 找到一个数组的所有局部最大值,该数组增加或减少 1

java - 这个java leetcode解决方案在最坏的情况下使用二次时间吗?