设A [1,...,n]是在每个位置存储位(1或0)的数组,f(m)是时间复杂度为θ(m)的函数。考虑用C语言编写的以下程序片段:
案例1: -
counter = 0;
for (i = 1; i < = n; i++)
{
if (A[i] == 1)
counter++;
else {
f(counter);
counter = 0;
}
}
案例2: -
counter = 0;
for (i = 1; i < = n; i++)
{
if (A[i] == 1)
counter++;
else {
counter = 0;
f(counter);
}
}
该程序片段的复杂性是
(A)Ω(n2)
(B)Ω(nlog n)和O(n2)
(C)θ(n)
(D)O(n)
问题是我怎么知道当使用if语句或else语句以及何时调用f(m)函数时,我如何处理它?我可以考虑仅在执行时或仅在其他情况下执行的情况,但有时候if语句执行时会发生什么情况,有时会声明
答案 0 :(得分:2)
我们可以从简单的案例开始,案例2.显然,每次我们在案例2中完成循环时,会发生以下两种情况之一:
我们经历了n次循环,每次需要几乎O(1)时间,bada-bing,bada-boom,如果你是O(n)(或O(n * lg(n))迂腐并使用可变长度整数。)
另一方面,案例1需要一点数学思考。
在案例1中花费最短时间的位字符串显然是11111....11111
,000....000
,000...0111...111
或类似字符串。所有这些都需要θ(n)时间来完成,为案例1建立一个下限。现在,我们需要建立一个最坏情况。
没有进入适当证明的严格性,断言最坏情况的位字符串看起来很简单:
111....1110
上面形式的长度为100的位字符串将有99个1,因此需要99 + 99
个时间单位才能完成。长度为n的字符串显然需要2(n - 1)
个时间单位才能完成。
这在n中显然是线性的,所以情况1,即使在最坏的情况下,也是θ(n)。
因为情况1和情况2都是θ(n),问题是θ(n)。
如果您仍然需要确信11.....110
是最坏情况的位字符串,请考虑以下事项:
A bit string of the form
|--------------n bits------------|
1....101....101....10......1....10
|-L1-| |-L2-| |-L3-| |-Lm-|
11110
Where L1 - Lm are arbitrary integers will require time
t = (L1) + (L2) + (L3) + ... + (Lm) + (n - m)
= sum(L1 to Lm) - m + n
the more "runs" of ones there are, the larger the - m factor is. If we
just have one big "run" of ones, we have
t = n - 1 + n - 1 = 2(n - 1)
作为matter of principle,我不会回答关于stackoverflow的问题不好的问题。
然而,在与聊天中的coder101交谈后,他/她告诉我这是不一个家庭作业问题,而是从在线数据库here中检索到的问题,这意味着提供“极客的模拟测试”。这似乎是coder101赋予自己的挑战,虽然这可能是一个更好的问题,但我认为这不是那么糟糕。