我正在阅读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的情况如何允许我们索引各个输入元素?
答案 0 :(得分:6)
首先,lg
它们显然意味着记录基数为2,因此lg n
是n
中的位数。
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位