多项式时间复杂度

时间:2011-09-22 15:09:42

标签: algorithm analysis time-complexity

来自here

的代码
ub4 additive(char *key, ub4 len, ub4 prime)
{
  ub4 hash, i;
  for (hash=len, i=0; i<len; ++i) 
    hash += key[i];
  return (hash % prime);
}

他们说这需要5n + 3条指令。他们是如何计算的?我该如何计算?

3 个答案:

答案 0 :(得分:3)

进行此计算您需要一些基本原语系统。例如,在计算机编程艺术中,Knuth使用MIX计算机进行这些计算。不同的基础计算机可能具有不同的指令,并且这种计算的结果不同。在您的特定示例中,设置它的常用方法是:

  • hash&lt; - len(1 op)
  • i&lt; - 0(1 op)
  • i&lt; len,i ++(2 * n ops)
  • key [i] lookup(n ops)
  • hash + key [i](n ops)
  • hash&lt; - hash + key(n ops)
  • hash%prime(1 op)

这将总计为5n + 3。

变化可能与以下几行有关:

  • 声明/创建两个hashi可能非常耗时。正常的cpu可能不需要做额外的工作,因为声明,认为寄存器/堆栈存储。
  • hash += hash + key[i]可能被视为基本系统上的一个操作,依此类推。

编辑:请注意,这些计算主要用作假设硬件的思想实验。除非在极少数情况下,现实生活中的处理器很可能不会像这些计算那样完全表现。

答案 1 :(得分:1)

在循环内部,每次迭代都有5个操作:

  1. 比较i<len
  2. 获取索引key[i]
  3. 添加hash + key[i]
  4. 分配到hash
  5. 增量++i
  6. 你的循环运行n次,因此5n

    在循环之外,您有3个操作:

    1. 将len分配给哈希hash=len
    2. 将0分配到i i=0
    3. 执行hash % prime
    4. 因此,5n + 3

答案 2 :(得分:0)

让我们开始计算说明。

  1. hash = len和i = 0执行一次,无论如何,所以我们至少有2条指令。
  2. hash%prime并返回执行至少一次,因此这是1或2条指令(取决于你是否将“return”作为指令计算......我怀疑它们没有)。
  3. 循环的每次迭代都需要i&lt;&lt; len,++ i,key [i],hash + key [i],hash = hash + key [i]。因此,对于循环的每个len(n)次迭代,我们有5条指令被执行一次。
  4. 加起来,我们得到约2 +(1或2)+(4或5)n,因此3 + 4n <= T(n)<= 4 + 5n。 3 + 5n是合理的;确切的答案取决于您如何计算个别指示。更详细的模型可能将简单的分配计为需要比例如时间更短的时间。模数运算......