Programming Perls

Column 1 

#10

简述 :发生在一个store(2)的故事 ,顾客的电话号码(1)来作为database中,检索(3) 的 PK ( primary key ),而且,显然每个顾客知道自己的电话号码,并且,电话号码“几乎”唯一(4) 。

要求 :高效地 插入 和 检索 。

背景 : 

1. 米国的电话号码都是 area code - in-area code ( 3 + 7 digits ) . ,如 412-268 7884。

2. store:估计也就比grocery大一点,国内地区性连锁卖场的分店,比如红旗啊,大润发之类

3. 检索:retrieval 。

4. 原文:close to unique。


思考过程 :

数据的pattern(pattern是fixed,是一种invariant):因为假设是地区性的store,所以area-code可以认作是相同的(而且非本area的顾客,不会跑来买东西),因此,datum 实际上是 7-digits 的sequence,当然,当做million级别的数也是正确的,这里还不需要考虑。

数据的规模 :虽然有 7-digits 的 “空间” , 但是 ,在那个时代 , 估计这样的 store 一天有 1k 的人电话订购 就很正常了。即使order保存 4~5 天 , 也不过 4~5 K 的 record。而且,数据是 random 分布在 7-digits 的 ”空间“ 中的 。 

数据的特点 :sparse 是 最大的特点。


对数据的操作(manipulation on data ) : 要求是 insert 和 retrieval 。 但显然 , 有了 insert 就该有 delete ( 删除 order *无论过不过期,都是要删除的* )。 这显然是一个 一个 set 操作集合 : 

insert , delete 和 contains 。 那么 ,选用的 , 自然应该是 set类型的 数据结构。


于是:

bitmap :本column讲的就是bitmap。三个操作都是O(1) 的 ,似乎很好地解决了

 但有个问题 : 数据是 sparse 的 ,也就是说 , bitmap 的巨大 存储空间内 , 会有大量的 holes , 存储的利用率太低了。


那么,还能进一步optimize么?还有别的数据结构(应该是 set 类型的 DS ),可以在 3个操作上得到O(1) 的 时间复杂度 , 并且 , 提高存储的利用率么 ?




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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值