我正在阅读关于如何在没有明确初始化的情况下使用数据向量的“技巧”(引用Aho,Hopcroft,Ullman)。
诀窍是使用2个额外的向量(From
To
)和整数Top
。
在访问向量DATA[i]
中的元素之前,如果满足From
To
和Top
之间的特定条件,则元素i
被视为已初始化。
如果条件不符合,则初始化元素,From
To
和Top
更新如下:
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]
已初始化。
我没有看到边界案件吗?在我看来这已经足够了 还是我错了?
答案 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
都不需要事先初始化,并且所有这些都可以是如此大的数组,以至于初始化需要相当长的时间。
一开始,任何数组的任何条目都可以具有任何值。对于某些i
,To[From[i]] == i
,可能是偶然的。 (当设置Data[From[i]]
时,该条件可能是偶然的或。)但是,Top
计算到目前为止设置的Data
元素的数量,所以测试From[i] <= Top
可以完全区分案例。