【问题标题】:What's the average complexity of these functions?这些函数的平均复杂度是多少?
【发布时间】:2018-12-14 01:18:03
【问题描述】:

我不确定如何计算平均复杂度。

if (condition) {
    for (1 : n) {
        do stuff
    }
}

给定这个具有给定条件的函数,如果它的条件在 99.9999999999999% 的时间为假,我如何计算它的复杂性;错误的 70%? 50%? 10%? 0.00000001%

【问题讨论】:

  • 当您涉及概率时,将条件所花费的时间乘以它被触发的机会。
  • @LorenPechtel 但复杂度不会因任何系数而改变?
  • 是的,通常的结果是丢失的只是常量。有时不是。
  • @LorenPechtel 似乎不对。常量什么时候不会丢失? 0以外。

标签: time-complexity complexity-theory


【解决方案1】:

如果我们用p(和p > 0)表示你的条件的概率,并且do stuff是一个常数时间运算,那么你的算法的时间复杂度将是O(p*n) = O(n)

在这种情况下,您选择的概率对时间复杂度没有影响这一事实可能确实会引起一些混乱。自然,如果p = 0.5,算法将平均运行一半的时间,就像p=1。但是 big-O 是函数增长速率的度量,这就是为什么常数项没有影响的原因。

但是,平均时间复杂度可能比这更有趣。特别是如果概率取决于输入,很容易构建一个有趣的事情发生的例子。考虑以下算法:

r = a uniformly random integer from 1 to n
if (r==1) {
    for (1 : n) {
        do stuff
    }
}

现在,foor 循环将以1/n 的概率执行,因此平均时间复杂度将为O(1/n * n) = O(1)。请注意,最坏​​情况的时间复杂度仍然是O(n)

举一个更实际的例子,考虑Quicksort algorithm。它的平均时间复杂度为O(n*log(n)),而最坏情况下的时间复杂度为O(n^2)。这里影响概率的是输入列表中的元素,而不是它的长度n

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 2017-09-11
    • 2019-06-08
    • 2011-08-07
    • 1970-01-01
    相关资源
    最近更新 更多