【问题标题】:Confused about "c lg n" in Introduction to Algorithms book - what is c?对“算法介绍”一书中的“c lg n”感到困惑-什么是c?
【发布时间】:2014-08-02 00:32:53
【问题描述】:

我正在阅读“算法简介”这本书,我对这部分感到困惑:

我们还假设每个数据字的大小有限制。例如,当使用大小为 n 的 >inputs 时,我们通常假设对于某些 >constant c>=1,整数由 c lg n 位表示。我们要求 c>=1 以便每个单词都可以保存 n 的值,从而使我们能够>索引各个输入元素,并且我们将 c 限制为常数,以便单词 >size 不会任意增长。

这个常数c的目的是什么?

【问题讨论】:

  • 这个问题对 cs.stackexchange.com 来说不是比 SO 更合适吗?
  • 这个问题似乎是题外话,因为它属于 cs.stackexchange.com

标签: algorithm complexity-theory analysis logarithm


【解决方案1】:

常数 c 的原因是您在大型字大小的机器上处理小输入的情况。例如,如果您在 64 位机器上工作,但只处理大小为 212 的输入,则 lg n 的值将为 12,但该机器是 64 位机器。假设这里的字长正好是 12 位是不正确的。 c 的附加因子允许我们假设机器字长至少为 lg n,但可能更大,而不会弄乱分析。

希望这会有所帮助!

【讨论】:

  • 那为什么还要关心lg n?假设ww = wordsize 而不是c lg n 不是更正确吗?
  • @Absurd-Mind 我们需要字的大小至少足以容纳代表输入大小的数字(否则,您甚至不能将数组索引存储在单个机器字中) .如果输入的大小为 n,那么您需要 lg n 位来写出数字 n,因此要求它至少为 lg n。这有意义吗?
  • 我不明白...在这种情况下 c 会是什么?为什么 c 是必要的?如果它只处理大小为 2^12 的输入,为什么它会更大?
  • @user3731608 c 可以是任何常量;没关系。我上面使用的数字只是示例。要点是机器字的大小足以容纳问题的大小。任何额外的松弛都无关紧要。
  • 对不起,我还是不明白……c 的意义何在?你说你可能在一个巨大的字大小机器上处理小输入,但为什么这需要使用这样一个常量?常量有什么作用?
【解决方案2】:

考虑跟随,

long long int num = 4096;

上述数字的二进制值是 2^12,因此需要至少 12 位进行存储。现在考虑您使用的机器在 32 位架构上运行。 现在来回答你的问题, == lg n == 用于计算存储输入大小所需的位数。这里不需要的位数是 12,如图所示

lg n = lg 2^12 = 12 bits

但是现在我们知道总空间是 32 位,因此如果我们愿意,我们可以占用更多空间,但我们可以占用少于 12 位吗? 绝对不,无论如何我们至少需要 12 位,这就是为什么我们需要一个常数 c 使得

c >= 1

这是为了确保我们不会得到少于 12 位的实例让我们考虑是否

c = 0.5

那么在这种情况下,分配的总位数将是

c lg n = 0.5 * lg 2^12 = 6 bits

这比要求的要小,因此 c 应该大于 1,即使 c = 2 大于 1 也不会产生问题并分配总共 24 位,这已经足够了,即 12 位但小于 32位是最大字长 因此 c 用于获得至少最小的大小来存储单词,实际上在实际情况下它总是最小的。

【讨论】:

    【解决方案3】:

    假设大小为 8。我们都知道 8 的 log base 2 是 3,因为 2^3 是 8。如果我们将 8 转换为二进制形式,它将变为 1 0 0 0,我们需要 4 位和不是 3 位来表示 8。所以我们要做的是添加 c 作为常数。并且 c 大于 1,因为如果 c 小于 1,那么它将小于 3,我们不想这样做。所以我们可以添加一个大于 1 的常数。通过添加常数,可以将 3 位升级为 4 位。这就是为什么它是 c log n。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 2018-01-11
      • 2021-09-21
      • 2015-07-12
      • 2015-01-21
      • 2014-12-21
      相关资源
      最近更新 更多