簡體   English   中英

序列化二叉搜索樹

[英]Serializing a Binary Search Tree

如何序列化BST? 最有效的方法是什么? 現在,這太籠統了,所以讓我解釋一下我的意思。

這是一些偽偽代碼:

public int[] serialize(root){
    preorder traversal 
    convert node to binary representation
    add the binary representation to an array
    send array via stream
}

要么

public int serialize(root){
    preorder traversal 
    convert node to binary representation
    send the binary representation via stream
}

我的問題是-創建一個數組並將其發送滿位,這樣有效嗎? 還是我應該跳過整個數組的想法,而每當轉換一個節點時,將其發送以反序列化? 也許這兩種實現都是愚蠢的。 任何幫助,將不勝感激。

我建議您也看看Google協議緩沖區https://developers.google.com/protocol-buffers/docs/overview

它取決於樹和數據類型。 如果樹中節點的順序很重要,則需要存儲足夠的信息來重新創建它。 如果在數組中,則可以使用數組中的位置重新創建結構

由於預購和訂購不是唯一的,因此只能按后序序列化BST。

1)預購中不唯一

      root                     root
    /     \                   / 
  left    right             left
                               \
                               right

2)順序不唯一

     1                 1
    /                   \    
   2                     2

如果通過“流”談論的是C ++ iostream,則它們已經以合理的大小進行了緩沖,並且插入該緩沖區的成本非常低。 標准庫已經成熟; 在自己的游戲中擊敗它非常困難。 並且您需要利用可利用的細節來獲取有價值的東西。 說:

輸出緩沖區應有多大(簡並的情況是單元素緩沖區,即沒有緩沖)取決於緩沖區刷新的開銷。 該開銷將具有固定成本和與大小相關的成本-在給定的緩存效果下,這不是簡單的線性成本。 固定開銷越昂貴,更大的緩沖區有助於攤銷固定費用。 例如,如果緩沖區刷新可以觸發零拷貝I / O,則緩沖所有較大的序列化操作可能會便宜得多,但是如果輸出操作將復制源緩沖區,則緩沖區大小將減小四分之一左右。當刷新的固定成本較低時,L1高速緩存大小是不錯的選擇。

除非時間序列化將其置於關鍵路徑上(即,使其成為用戶正在等待的東西),否則所有這些都無關緊要-對於這樣的事情,除非您要談論數百萬個項目及以上,否則它將很難產生。 即使這樣,如果你還沒有已經在它的工作幾乎可以肯定有一個在您制作一個單獨的序列化比在緩沖方案選擇更多的廢物-即使如此永遠不會忘記你的賽車的。 是I / O帶寬嗎? 與低級壓縮器相比,通過低級壓縮器發送序列化流可以輕松節省更多時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM