遗留昨天的第一章的习题9,关于用牺牲空间的办法来换取时间的初始化办法;
作者给的习题参考答案代码如下:
from[i] = top;
to[top] = i;
data[i] = 0;
top++;
刚看的时候有点突兀,后面看了别人的一些解析恍然大悟原来是这样,这段代码给出的情景如下:
当n很大的时候,如果我们按平常那样先初始化标记数组为0,这样会耗费一个O(n)的时间,有时候不想这样耗费同时空间又充足的情况下,就会想到可否采用牺牲空间换时间的想法,根据作者给出的代码作一下分析:
我们需要对 元素 i 进行判定是否被初始化
if(from[i]<top&&to[from[i]]==i){//判定是否初始化
//表明已经被初始化
分析: from[i]如果在被初始的情况下,根据没被初始化前的处理,from[i]一定是得小于top的,不过由于在from[i]未被初始的情况下,
它可以使任何值,所以同样有可能会小于top,所以这里to数组的作用就显现了,就是为了避免这种情况出现所加的条件,要求to[from[i]] ==i; (虽然这里to[from[i]]也是随机的,要让在前一个未随机的基础上作为下标得到的又一个随机值恰巧等于i的概率应该很小或者为0,这里就先这么理解吧,嗯。。。)这样一来就可以解释了。
}
else{//遇见一个没有被初始化的i
from[i] = top; //将top值赋予它,代表这是第几个被初始化元素的下标
to[top] = i; // to数组的更新
data[i] = 0;//这里就有点不太理解了,难道是初始化么?谁能解释一下。。。
top++; //top往后推,要保证已经初始化的元素下标必须小于它的要求
}