编程珠玑课后题,吝啬的初始化

在这里,我们有一个稀疏的数组需要访问,并且在第一次访问的时候将其初始化为0. 因为数组很大,并且需要访问的数组元素很稀疏,而程序要求的时间很宝贵

       所以,我们不能直接将data数组的各个元素都初始化为0.

       我们需要做的是在第一次数组data中的某个元素的时候,将其初始化为0. 如果之后再次访问到该元素,应该能够判断其是否已经被初始化过,避免多次初始化从而覆盖数据

       在提供的解决方案中,就使用了from,to两个向量和top变量来保存哪些变量已经被初始化了。

       当我们访问索引为i的data元素时,我们通过判断form[i]是否小于top,并且to[from[i]]是否等于i来判断元素树否被初始化过。

       需要注意的是我们使用to向量的原因是为了防止from中的未经初始化的数据刚好因为小于top而导致出现错误判断。也就是说,我们是不对from和to向量进行初始化的(因为我们连对data进行初始化的成本都不肯),所以无法判断from中的数据哪些是我们写入的,哪些是原来就有的。于是,我们就通过增加一个to数组,并且增加一个判断条件来保证我们的判断是正确的。

       当然,这样的保证也并不是绝对正确的。只是小概率事件,直接忽略了吧???

综上:

       我们在访问data中索引为i的元素时,通过条件from[i]<top和to[from[i]]=i来判断该数据是否被初始化过。

       如果已被初始化过,就直接访问该数据;

       否则,使用如下的语句对其进行初始化,并且在from,to和top中保存该数据已被初始化过这个信息:

       from[i]=top;

       to[top]=i

       data[i] = 0

       top++.

你可能感兴趣的:(编程)