考虑算法复杂度分析中的大上界

时间:2017-04-22 14:27:50

标签: algorithm time-complexity asymptotic-complexity

我在考虑算法的复杂性分析,我想出了这个例子:有一个医生中心有几位医生;每个医生可以在一周中每个工作日的一小时内访问。 现在,假设我们有一个医生集合,每个医生都有预定访问的排序集合,如果我们想要找到任何医生是否有免费的特定位置,我们可以编写一个非常基本的算法来做到这一点: / p>

for (Doctor doc: doctors) {
    for (Visit visit: doc.visits) {
        if (visit.hour == hour && visit.day == day) {
            return false;
        }
        if (visit.day > day) {
            break;
        }
    }
}
return true;

虽然我知道这不是解决问题的最有效方法,但我想知道它的时间复杂性;一开始我考虑了O(n ^ 2)的时间复杂度,因为医生和访问的数量可以增长,并且代码包含两个嵌套循环,内部循环包含几个常量时间操作。

但后来我认为医生的数量肯定是一个上限,即居住在该中心国家的人数(如果我们考虑甚至是外国医生,那么仍有一个上限,世界人口〜 7.5亿);所以时间复杂度似乎降低到线性O(n),因为内循环只执行了一定次数。在Big-O术语中:O(C * N)= O(n)其中C是常数上限。

不满意,我还认为这个软件将不会运行医疗中心超过一个世纪,因为我确信在那段时间它将被重写;所以该软件将接受访问,直到2117年,即 - 假设每年230个工作日,每天8个插槽,184k插槽,再次上限。如果您认为该软件可以持续超过一个世纪,那么上限将成为太阳的预期寿命(约50亿年),之后地球上的生命将会消失。较高的上限,但仍然是上限。所以现在时间复杂度似乎为O(1),因为O(C1 * C2)= O(1)其中C1是医生上限,C2是访问上限。

这种推理是否正确?一般来说,在分析算法复杂度的同时假设大数为常数是正确的吗?

1 个答案:

答案 0 :(得分:1)

如果每位医生都有相同数量的visits,即如果以下循环

for (Visit visit: doc.visits)

总是运行一定次数,然后无论是十亿次次还是 10或20次次都无关紧要。只要它是常数,时间复杂度总是 O(n),这是线性的

原因是 Big O 的定义:

当我们f(n) = O(g(n)),所有f(n) <= cg(n)和某些常数n > n'时,

c。因此,只要内循环运行一段时间,就说 1000000 次。我们有f(n) = 1000000n,我们得到:

f(n) = 1000000n <= 1000001n, for all n > 0 and c = 1000001

我们得到 f(n)= O(n)