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) 的 时间复杂度 , 并且 , 提高存储的利用率么 ?