使用更多空间编程珍珠的恒定时间初始化 - 第 1 列

Posted

技术标签:

【中文标题】使用更多空间编程珍珠的恒定时间初始化 - 第 1 列【英文标题】:Constant time for initialization by using more space-Programming pearls - Column 1 【发布时间】:2012-05-03 03:35:12 【问题描述】:

我正在阅读“编程珍珠”,我对其中一个解决方案解释感到非常困惑——第 1 列中的问题 9。

问题是:当使用位图数据表示一组整数时,第一阶段将集合初始化为空。但是初始化空间本身可能需要大量时间。 展示如何通过设计一种技术在第一次访问向量时将其初始化为零来规避此问题。

答案是: 初始化向量data[0...n-1]的效果可以通过签名来完成 包含在两个额外的 n 元素向量中,fromto,以及一个整数 top。如果元素 data[i] 已经初始化,然后 from[i] top 和 to[*from*[我]] = 我。因此 from 是一个简单的 签名,以及 totop 一起确保 from 不会被内存的随机内容意外签名。

我已多次阅读此答案。没看懂。

谁能解释一下?

谢谢,

【问题讨论】:

【参考方案1】:

我发现以下链接中的帖子对于理解常量时间初始化技巧背后的想法非常有帮助。

链接:http://eli.thegreenplace.net/2008/08/23/initializing-an-array-in-constant-time/

希望对你有帮助-

【讨论】:

【参考方案2】:

这个页面帮助了我:http://comments.gmane.org/gmane.comp.programming.algogeeks/30667

但让我看看我能不能解释一下。

基本上问题是:如果向量足够大,将向量初始化为全 0 会花费大量时间。那么,我们如何通过使用更多空间来避免初始化为 0 呢?即我们如何区分这个向量中的随机数据和我们故意放在那里的数据?

Bentley 的解决方案是使用与数据向量和“top”大小相同的“from”(映射)和“to”(签名[实际上只是从索引的反向映射])向量是到目前为止数据数组中的元素数。 from[i] < top 很重要,如下所述。

使用解决方案中的示例: 我们声明一个数据数组并将元素个数设置为零:

top = 0
data = int array of integers of size 1,000,000 
       (all random values since we did not initialize it)

在索引 1 处插入一个元素(在这种情况下 i=1)。但是现在我们怎么知道那不是一个随机值呢?我们使用地图和签名。 “from”的索引等于数据的索引。

from[i] = top
to[top] = i
data[i] = 0 (I don't think it matters whether you set it to 0 or your intended value of 3)
top++ (top is now 1)

所以你可能会说如果to[from[i]] == i 是偶然的。好吧,既然我们声明了from[i] < top,这是不可能的。

检查以下两种情况:

A) 数据数组中尚未插入任何元素(即 top = 0) 这意味着 from[i] < 0 不是有效的数组索引。所以这是不可能的。

B) 插入了一个元素(即 top > 0,假设它是 1) 因为from[i] < top => from[i] = 0。但是,我们在数据数组中插入了一个元素,因此我们显式设置了to[from[i]] = i

top = 2...n

HTH

【讨论】:

以上是关于使用更多空间编程珍珠的恒定时间初始化 - 第 1 列的主要内容,如果未能解决你的问题,请参考以下文章

为啥此示例在字符串比较中使用空填充? “编程珍珠”:一串串珍珠

来自编程珍珠的示例

“编程珍珠”:qsort 的冲突类型

编程珍珠中的词频

编程珍珠:在 40 亿个整数的文件中查找缺失的整数

在恒定时间和线性空间中找到两个字符串的 LCP