我正在阅读“编程珍珠”,我对其中一个解决方案解释感到困惑 - 第1列中的问题9。
问题是:当使用位图数据表示一组整数时,第一阶段将该集初始化为空。但初始化空间本身可能需要花费大量时间。 通过设计一种技术,在第一次访问它时将向量的条目初始化为零,展示如何规避这个问题。
答案是: 初始化向量数据 [0 ... n-1]的效果可以通过签名来完成 包含在另外两个n元素向量中,从和到,以及一个整数 top 。如果元素 数据 [i]已初始化,然后来自 [i]< top 和 to [* from * [i]] = i。因此来自很简单 签名,到和 top 一起确保来自的不会被内存的随机内容意外签名。
我已多次阅读此答案。我不明白。
有人可以解释一下吗?
谢谢,
答案 0 :(得分:4)
此页面帮助了我:http://comments.gmane.org/gmane.comp.programming.algogeeks/30667
但是让我看看能不能解释一下。
基本上问题是:如果向量足够大,将向量初始化为全0会花费很多时间。那么,我们如何通过使用更多空间来避免初始化为0?即我们如何区分这个向量中的随机数据和我们故意放在那里的数据?
Bentley的解决方案是使用一个“来自”(地图)和“到”(签名[实际上只是反向映射以从索引])的大小相同的数据向量的向量和“顶”,其是到目前为止数据数组中的元素数。 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)插入了一个元素(即顶部&gt; 0,假设它是1)
由于from[i] < top
=&gt; from[i] = 0
。但是,我们在数据数组中插入了一个元素,因此我们明确设置了to[from[i]] = i
。
休息时间为top = 2 ... n
HTH
答案 1 :(得分:0)
我发现以下链接中的帖子非常有助于理解恒定时间初始化技巧背后的想法。
链接:http://eli.thegreenplace.net/2008/08/23/initializing-an-array-in-constant-time/
希望有所帮助 -