在分析计算机算法时理解关于机器字大小的假设

时间:2012-07-21 12:04:09

标签: algorithm integer

我正在阅读Thomas H. Cormen,Charles E. Leiserson,Ronald L. Rivest,Clifford Stein所着的书Introduction to Algorithms。在“分析算法”的第二章中提到:

  

我们还假设每个数据字的大小有限制。例如,当使用大小为n的输入时,我们通常假设对于某些常数c> = 1,整数由c lg n位表示。我们要求c> = 1,以便每个单词可以保存n的值,使我们能够索引单个输入元素,并且我们将c限制为常量,以便单词大小不会任意增长。(如果单词大小可以任意增长,我们可以在一个单词中存储大量数据,并在不变的时间内对其进行操作 - 显然是不切实际的情况。)

我的问题是为什么这个假设每个整数应该由c lg n位表示,以及c> = 1的情况如何允许我们索引各个输入元素?

3 个答案:

答案 0 :(得分:6)

首先,lg它们显然意味着记录基数为2,因此lg nn中的位数。

然后,他们所说的是,如果他们有一个算法来获取一个数字列表(我在我的例子中更具体,以帮助使其更容易理解),如1,2,3,...n,那么他们认为:< / p>
  • 记忆中的“单词”足以容纳任何这些数字。

  • 内存中的“单词”不足以容纳所有数字(单个单词,以某种方式打包)。

  • 在计算算法中的“步数”时,对一个“单词”的操作只需一步。

他们这样做的原因是为了保持分析的真实性(你只能在“原生”类型中存储一些大小的数字;之后你需要切换到任意精度库)而不选择特定的例子(比如32)在某些情况下可能不合适或过时的位整数。

答案 1 :(得分:4)

至少需要lg n位来表示大小为n的整数,因此这是存储大小为n的输入所需位数的下限。设置常数c> = 1使其成为下限。如果常数乘数小于1,则没有足够的位来存储n。

这是RAM模型中的简化步骤。它允许您将每个单独的输入值视为可以在内存的单个插槽(或“单词”)中访问,而不必担心可能出现的并发症。 (如果我们使用允许不同字长的模型,则加载,存储和复制不同字长的值将花费不同的时间。)这就是“使我们能够索引各个输入元素”的含义。假设问题的每个输入元素都可以在单个地址或索引处访问(意味着它适合一个内存字),从而简化了模型。

答案 2 :(得分:1)

很久以前就提出过这个问题,这些解释确实对我有所帮助,但我觉得还有一些关于lg n如何产生的澄清。对我来说,谈论事情确实有帮助:

让我们在基数10中选择一个随机数,如27,我们需要5位来存储它。为什么?好吧因为27是二进制的11011。注意11011每个都有5个数字&#39;数字&#39;我们称之为5比特。

将每个位视为一个插槽。对于二进制文件,每个插槽都可以容纳0或1.我能用5位存储的最大数字是多少?那么,最大的数字将填补每个插槽:11111

11111 = 31 = 2 ^ 5所以要存储31我们需要5位而31是2 ^ 5

一般情况下(为清晰起见,我将使用非常明确的名称):

numToStore = 2 ^ numBitsNeeded

由于log是指数的数学逆,我们得到: log(numToStore)= numBitsNeeded

由于这可能不会产生整数,我们使用ceil来回答我们的答案。因此,应用我们的示例来查找存储数字31所需的位数:

log(31)= 4.954196310386876 = 5位