序列化二进制搜索树

时间:2012-08-21 02:07:27

标签: java c++ serialization data-structures 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
}

我的问题是 - 创建一个数组并发送全部位,这有效吗?或者我应该跳过整个数组的想法,每次转换节点,发送它反序列化它?也许这两种实现都是愚蠢的。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:1)

我建议你也看看谷歌协议缓冲区 https://developers.google.com/protocol-buffers/docs/overview

答案 1 :(得分:0)

这取决于树和数据类型。如果树中节点的顺序很重要,则需要存储足够的信息来重新创建它。如果它在数组中,您可以使用数组中的位置重新创建结构

答案 2 :(得分:0)

BST只能按顺序序列化,因为预订和有序不是唯一的。

1)在预购中是非唯一的

      root                     root
    /     \                   / 
  left    right             left
                               \
                               right

2)按顺序非唯一

     1                 1
    /                   \    
   2                     2

答案 3 :(得分:0)

如果你通过“流”谈论C ++ iostream,它们已经以合理的大小进行缓冲,并且插入该缓冲区的成本非常低。标准库已经成熟;在自己的游戏中击败它是非常困难的。而你需要利用可利用的细节来获得有价值的东西。那说:

输出缓冲区应该有多大(退化情况是单元素缓冲区,即没有缓冲)取决于缓冲区刷新的开销。该开销将具有固定成本和与尺寸相关的成本 - 而不是给定缓存效果的简单线性成本。使用更昂贵的固定开销更大的缓冲区有助于摊销固定费用。例如,如果缓冲区刷新可以触发零拷贝I / O,那么缓冲所有较大的序列化可能会大大降低成本,但如果输出操作将复制源缓冲区,则缓冲区大小会减少大约四分之一。当刷新的固定成本很低时,L1缓存大小是一个不错的选择。

这一切都不重要,除非时间序列化将其置于关键路径上,即使其成为用户正在等待的东西 - 对于类似这样的东西,除非你在谈论数百万件物品,否则难以生产而且。即使这样,如果你还没有完成它,几乎可以肯定,你制作单个序列化的方式比你选择的缓冲方案更浪费 - 甚至那么永远不会忘记你是什么赛车。是I / O带宽吗?通过低级压缩器发送序列化流可以比预先做的任何事情都节省更多时间。