找出输入与循环执行次数之间的关系。

时间:2017-10-05 16:36:04

标签: algorithm sequences

鉴于此代码:

k = 1;
p = 0;
while (k < n){
  k *= 3;
  p++;
}

定义第03行以n表示的次数,其中n为输入。 (提示:在第06行的循环结束时找出p和k如何与n相关。在n中表示p并用它来回答这个问题。)

到目前为止,我所做的是计算出p和k执行与n的这些值相关的次数:

  • n = 1 - &gt; k / p iterations = 1
  • n = 3 - &gt; k / p iterations = 3
  • n = 10 - &gt; k / p iterations = 3
  • n = 30 - &gt; k / p iterations = 4

我正在努力弄清楚如何定义n与k / p的迭代次数之间的关系。如果有人可以请解释如何确定这一点,将不胜感激。

2 个答案:

答案 0 :(得分:1)

您通过尝试几个不同的示例并查看是否可以发现模式来解决此问题。这是一个合理的方法,但是开始工作有点棘手。相反,您可能希望在循环迭代时查看k所采用的值,并查看是否可以在那里工作。

请注意,k作为循环迭代次数的函数呈指数增长:它采用值1,3,9,27,81,....换句话说,它采用了值

  

3 0 ,3 1 ,3 2 ,3 3 ,3 4 等。

而且,更一般地说,在循环迭代i中,它取值3 i

假设只要k大于或等于n,这个循环就会停止,我们可以通过求解3 i 的最小值来计算出多少循环迭代次数。 ≥n。我们可以这样做:

  

3 i = n

     

i = log 3 n

这个数字可能不是一个整数,所以我们通过取上限然后说迭代次数是⌈log 3 n⌉

一般来说,如果你看到一些过程可以通过一个恒定的因子反复增长(总是三倍,或总是加倍,或总是上升10倍等),你应该期待看到某种对数术语出现。这是您看到O(log n)的最常见方式之一。

答案 1 :(得分:0)

首先,你的观察有点不对劲。

对于不同的n值,第6行结束后的k和p值将为: -

n = 1 => k = 1 and p = 0.

n = 3 => k = 3 and p = 1.

n = 9 => k = 9 and p = 2.

n = 10 => k = 27 and p = 3.

n = 27 => k = 27 and p = 3.

n = 30 => k = 81 and p = 4.


现在,在第6行的末尾,

if n == k
  then 3^p == n
otherwise,
  3^(p-1) < n < 3^p