合适的树数据结构

时间:2012-06-27 11:56:12

标签: algorithm data-structures tree go binary-tree

哪个是最适合建模分层(包含关系)内容的树数据结构。我的语言有点不正式,因为我没有太多关于这些的理论背景

  1. 父节点可以有多个子节点。
  2. 独特的父母
  3. 树结构很少更改,可以重新创建,而不是添加/重新排列节点。
  4. 双向遍历
  5. 主要感兴趣的是,查找父项,查找子项,查找具有唯一ID的节点
  6. 每个节点都有唯一的ID
  7. 总共可能只有数百个节点,因此性能影响不大
  8. 持久性可能很好,但没有必要,因为我打算在从数据库中读取数据后在内存中使用它。
  9. 我选择的语言是golang(Golang),所以可用的库是有限的。请在不考虑最符合上述要求的语言的情况下给出建议。

    http://godashboard.appspot.com/列出了一些可用的树库。不确定它们的质量和活跃程度。我读了上帝

    1. https://github.com/petar/GoLLRB
    2. http://www.stathat.com/src/treap
    3. 请告知所需的任何其他信息。

2 个答案:

答案 0 :(得分:3)

由于只有数百个节点,因此只需使结构与您所描述的相同即可。

  • 每个节点都有对父节点的唯一引用。
  • 每个节点都有一个子节点列表。
  • 每个节点都有一个id
  • 来自id的(外部)地图 - >节点。甚至可能没必要。

可以进行2路遍历,因为父节点和子节点都是已知的。查找父母和查找孩子的情况相同。
如果没有地图,可以通过遍历整个树来查找id。或者您可以使用地图快速找到节点。

添加节点很简单,因为每个节点都有一个列表。重新排列也很简单,因为您可以在子节点列表中自由添加/删除并重新分配父节点。

我正在从与语言无关的方面回答这个问题。这是一个没有任何限制的树结构,因此实现并不那么受欢迎。

答案 1 :(得分:0)

我认为B-Tree可以满足您的需求。 http://en.wikipedia.org/wiki/B-tree  

第1,2,3点:B-Tree固有地支持这一点。 (多个孩子,独特的父母,允许插入/删除元素

第4,5点:默认情况下,每个节点都会有其子节点的指针。此外,您可以维护每个节点的父指针。您可以借助这些指针实现BFS / DFS的搜索/遍历操作

Pomit 6:如果您不允许重复记录,则取决于插入方法的实现

Pont 7,8:不是问题,因为你提到你只有数百条记录。虽然B-Tree也是非常好的外部磁盘存储数据结构。