【问题标题】:polynomial time complexity多项式时间复杂度
【发布时间】:2011-11-22 22:39:22
【问题描述】:

这是来自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 条指令。他们是怎么计算的?应该怎么计算?

【问题讨论】:

    标签: algorithm analysis time-complexity


    【解决方案1】:

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

    1. 比较i&lt;len
    2. 获取索引key[i]
    3. 添加hash + key[i]
    4. 分配到hash
    5. 递增++i

    您的循环运行n 次,因此5n

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

    1. 将 len 分配到哈希 hash=len
    2. 将 0 赋值给 i i=0
    3. 执行hash % prime

    因此,5n + 3

    【讨论】:

    • 不是 ub4 哈希,我;变量声明算不算?为什么不?? CPU不执行变量声明指令吗??
    【解决方案2】:

    让我们开始数指令吧。

    1. hash=len 和 i=0 无论如何都会执行一次,所以我们至少有 2 条指令。
    2. hash % prime 和 return 至少执行一次,因此这是 1 条或 2 条指令(取决于您是否将“return”计为指令...我怀疑他们没有)。
    3. 循环的每次迭代都需要 i

    加起来,我们得到大约 2 + (1 或 2) + (4 或 5)n,因此 3 + 4n

    【讨论】:

      【解决方案3】:

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

      • 散列
      • i
      • i
      • key[i] 查找(n 个操作)
      • hash + key[i] (n ops)
      • 散列
      • hash % prime (1 op)

      这将是 5n + 3。

      变化可能是:

      • 声明/创建两个hashi,可能会很耗时。由于声明,普通的 cpu 可能不需要做额外的工作,想想寄存器/堆栈存储。
      • hash += hash + key[i] 可能被计为基本系统上的一项操作,依此类推。

      编辑:请注意,这些计算在假设硬件上作为思想实验最有用。除了极少数情况外,现实生活中的处理器很可能不会完全按照这些计算行事。

      【讨论】:

        猜你喜欢
        • 2021-11-30
        • 1970-01-01
        • 2016-02-13
        • 2012-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多