在不初始化向量的情况下访问元素。我需要额外的空间吗?

时间:2011-11-19 20:47:31

标签: algorithm language-agnostic data-structures computer-science

我正在阅读关于如何在没有明确初始化的情况下使用数据向量的“技巧”(引用Aho,Hopcroft,Ullman)。

诀窍是使用2个额外的向量(From To)和整数Top

在访问向量DATA[i]中的元素之前,如果满足From ToTop之间的特定条件,则元素i被视为已初始化。

如果条件不符合,则初始化元素,From ToTop更新如下:

Top = Top + 1
From[i] = Top
To[Top] = i
Data[i] = 0

条件是知道元素是否已初始化为:
 From[i] <= Top && To[From[i]] == i
如果为true则表示已初始化。

我的问题是:为什么需要额外的载体?

从我的角度来看,如果我访问一个元素并i<=Top,那么元素就会被初始化。然后我增加i,即i++

在这种情况下,如果i <= TOP表示DATA[i]已初始化。

我没有看到边界案件吗?在我看来这已经足够了 还是我错了?

2 个答案:

答案 0 :(得分:3)

如果这是我想到的例子,那么你不知道DATA []的元素将被访问的顺序 - 它被用作稀疏数组,例如几乎为空的哈希值表。因此,要访问的前3项可能是DATA [113],DATA [29]和DATA [123123],而不是DATA [0],DATA [1]和DATA [2]。实际上你可以在没有From []的情况下离开,在这种情况下,To将存储{113,29,123123} - 但是每次你想要查看DATA的一个元素是否有效时,你必须搜索所有To。如果你想看看123123是否有效,你会看到[0] = 113没有运气到[1] = 29没有运气到[2] = 123123哦是的123123是有效的。

答案 1 :(得分:2)

节省时间的想法是,To, From, Data都不需要事先初始化,并且所有这些都可以是如此大的数组,以至于初始化需要相当长的时间。

一开始,任何数组的任何条目都可以具有任何值。对于某些iTo[From[i]] == i,可能是偶然的。 (当设置Data[From[i]]时,该条件可能是偶然的。)但是,Top计算到目前为止设置的Data元素的数量,所以测试From[i] <= Top可以完全区分案例。