读《编程珠玑》之初始化牺牲空间换时间

遗留昨天的第一章的习题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往后推,要保证已经初始化的元素下标必须小于它的要求

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值