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) 的 時間複雜度 , 並且 , 提高存儲的利用率麼 ?




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章