这个伪代码的复杂性是什么

时间:2019-06-15 13:59:46

标签: algorithm time-complexity complexity-theory pseudocode

我在考试中发现了这种专长,遇到了解决问题的困难。

我可以肯定地说,由于for,算法至少会占用O(n),但是我不知道该如何处理一会儿。我知道在这种情况下,我必须评估最差的if-else分支,并确定它是第二个分支。

for i=1...n do
    j=n
    while i<j do
        if j mod 2 = 0 then j=j-1
        else j=i

直觉上我认为总成本是:O(nlogn)= O(n)* O(logn)

2 个答案:

答案 0 :(得分:5)

简而言之while循环将每个时间最多运行两次迭代。这使得算法 O(n)

while循环最多重复两次。确实,让我们看一下while循环:

while i < j do
    if j mod 2 = 0 then
        j=j-1
    else
        j=i

很明显,我们仅在while时执行i < j循环。此外,如果j mod 2 == 1(因此j odd ),则它将设置j = i,因此while循环将不再运行。

另一方面,如果j mod 2 == 0(所以j even ),则我们递减j。现在可能发生两件事,或者i == j,在这种情况下,我们不会执行额外的迭代。但是,如果我们执行额外的迭代,则if条件将失败,因为递减 even 数会导致 odd 数。由于我们每次都设置j = n,所以这也意味着while循环执行的步骤数由n本身决定。

因此,这意味着无论ij的值是多少,while循环的正文将最多执行两次。

由于我们执行了whilen循环,因此这意味着算法仍然是 O(n) 。这里我们假设可以检查数字的奇偶性并在固定时间内递减数字。

答案 1 :(得分:3)

mod是否指代Modulo?在这种情况下,while循环最多会评估两次;一次递减j,然后j mod 2将是1,并且在设置j=i之后,您的i<j将为假。复杂度差异随输入的增加而波动而不是增加,因此该分支的复杂度为O(1)。