【问题标题】:Recurrence Relation for a loop循环的递归关系
【发布时间】:2010-10-20 13:37:28
【问题描述】:

问题是建立一个递归关系来找到算法给出的值。答案应该是 teta() 术语。

foo = 0;

for int i=1 to n do
    for j=ceiling(sqrt(i)) to n do
        for k=1 to ceiling(log(i+j)) do
             foo++

【问题讨论】:

  • 这是作业吗?如果是这样,请将其标记为这样。
  • 标记的作业,重新格式化是什么意思。我是这个平台的新手。有什么我需要用来格式化的吗?
  • 那么,现在,具体的问题是什么?您希望我们发布最终解决方案吗? -- foo 代表什么?
  • 我修改它 foo 是每一步递增的变量。我想要一个递归关系“f(n) = blah blah”,这是所有迭代后 foo 的最终值

标签: algorithm complexity-theory recurrence


【解决方案1】:

不完全确定,但就是这样。

第二个循环执行 1 - sqrt(1) + 2 - sqrt(2) + ... + n - sqrt(n) = n(n+1)/2 - n^1.5 次 => O(n^2) 次。有关sqrt(1) + ... + sqrt(n) = O(n^1.5) 的讨论,请参阅here

我们已经确定第三个循环将被触发O(n^2) 次。所以该算法渐近等价于这样的:

for i = 1 to n do
    for j = 1 to n do
        for k = 1 to log(i+j) do
            ++foo

这导致总和log(1+1) + log(1+2) + ... + log(1+n) + ... + log(n+n)log(1+1) + log(1+2) + ... + log(1+n) = log(2*3*...*(n+1)) = O(n log n)。这乘以n,得到O(n^2 log n)

所以你的算法也是O(n^2 log n),如果我没记错的话也是Theta(n^2 log n)

【讨论】:

  • +1: Theta(n^2 log n) 看起来是对的,因为没有交出递归关系...
猜你喜欢
  • 2021-09-05
  • 2018-08-15
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
  • 2019-07-07
相关资源
最近更新 更多