我在考试中发现了这种专长,遇到了解决问题的困难。
我可以肯定地说,由于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)
答案 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
本身决定。
因此,这意味着无论i
和j
的值是多少,while
循环的正文将最多执行两次。
由于我们执行了while
次n
循环,因此这意味着算法仍然是 O(n) 。这里我们假设可以检查数字的奇偶性并在固定时间内递减数字。
答案 1 :(得分:3)
mod
是否指代Modulo?在这种情况下,while循环最多会评估两次;一次递减j
,然后j mod 2
将是1
,并且在设置j=i
之后,您的i<j
将为假。复杂度差异随输入的增加而波动而不是增加,因此该分支的复杂度为O(1)。