2012-04-21 46 views

回答

6

在C語言中實現持久化數據結構的方式與在函數式語言中的實現方式基本相同。 Chris Okasaki的Purely Functional Data Structures是一個很好的參考。

一般來說,將固定寬度的整數映射到對象就足夠了,因爲 雖然沒有爲您提供完整的字典本身,但您可以在頂部創建一個字典:使用實際密鑰的散列作爲基礎地圖的關鍵字,並讓葉指向相同散列值的(鍵,值)對的列表。

棘手的部分是內存管理,因爲您通常不知道何時部分數據結構變得無法訪問。幸運的是,由於大多數持久數據結構都基於樹,引用計數通常效果很好。爲了能夠管理數據結構所引用的對象,可以爲葉節點的引用計數變爲0時調用的回調提供掛鉤。

例如,我的C位實現Patricia Trees提供了以下內容API:

// Querying 
void *bpt_get(bpt_t bpt, bpt_key_t key); 
bool bpt_has_key(bpt_t bpt, bpt_key_t key); 

// Adding and Removing Entries 
bpt_t bpt_assoc(bpt_t bpt, bpt_key_t key, void *item); 
bpt_t bpt_dissoc(bpt_t bpt, bpt_key_t key); 

// Managing Memory 
void bpt_retain(bpt_t bpt); 
void bpt_release(bpt_t bpt); 
void bpt_dealloc(bpt_t bpt); 
void bpt_set_dealloc_hook(bpt_t bpt, 
          bpt_key_t key, 
          void (*hook)(bpt_key_t key, 
             void* value)); 

// Iteration 
void bpt_for_mappings(bpt_t bpt, 
         void (*thunk)(bpt_key_t, void*, void*), 
         void *user_data); 

// Making a Map Persistent (you can elide this if you don't 
// want to support transients) 
void bpt_seal(bpt_t bpt); 

implementation可能會給你一些想法了。

+0

感謝您的迴應!內存管理不是我的問題 - 我已經使用引用計數編寫了一個樹實現。 我正在尋找的是一個功能字典實現 - 一個具有不斷查詢時間的數據結構。樹通常只給對數查找複雜度。 我在岡崎的論文中也找不到任何對辭典的參考。 – mirkokiefer 2012-04-22 12:07:22

+0

@mirkok如果查找時間是唯一重要的事情,那麼當然,您可以簡單地使用散列表並在每次更新時複製它。這總是一個折衷。也就是說,可以通過使用位圖來調整嘗試(我的實現可以; Clojure的PersistentHashMap可以;其他人可能也會這樣做)。通過位圖,訪問仍爲對數,但基數較大。這(從理論上講,但並不總是在實踐中)增加了複製開銷,但是減少了跳到葉子所需的跳數。 (對於32位位圖,2^32個鍵對應最多7個級別。) – 2012-04-22 13:15:18