Algorithm 合适的树数据结构

Algorithm 合适的树数据结构,algorithm,data-structures,tree,go,binary-tree,Algorithm,Data Structures,Tree,Go,Binary Tree,哪种树数据结构最适合为层次(包含关系)内容建模。我的语言有点不正式,因为我在这些方面没有太多的理论背景 父节点可以有多个子节点 唯一父项 树结构很少改变,操作系统可以重新创建而不是添加/重新排列节点 双向遍历 主要感兴趣的是,查找父节点,查找子节点,查找具有唯一id的节点 每个节点都有一个唯一的id 总共可能只有数百个节点,因此性能可能不会有太大影响 持久性可能很好,但不是必需的,因为我计划在从DB读取数据后在内存中使用它 我选择的语言是go(golang),所以可用的库是有限的。请给出建议,但

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

  • 父节点可以有多个子节点
  • 唯一父项
  • 树结构很少改变,操作系统可以重新创建而不是添加/重新排列节点
  • 双向遍历
  • 主要感兴趣的是,查找父节点,查找子节点,查找具有唯一id的节点
  • 每个节点都有一个唯一的id
  • 总共可能只有数百个节点,因此性能可能不会有太大影响
  • 持久性可能很好,但不是必需的,因为我计划在从DB读取数据后在内存中使用它
  • 我选择的语言是go(golang),所以可用的库是有限的。请给出建议,但不要考虑最适合上述要求的语言

    列出一些可用的树库。不确定它们的质量和活跃程度。我读过上帝的故事


  • 请告知所需的任何其他信息。

    由于只有数百个节点,只需将结构与您描述的相同即可

    • 每个节点都有对父节点的唯一引用。
    • 每个节点都有一个子节点列表。
    • 每个节点都有一个id
    • 存在来自id-->节点的(外部)映射。甚至可能没有必要。
    由于父节点和子节点是已知的,所以可以进行双向遍历。查找父项和查找子项的操作相同。
    如果没有地图,可以通过遍历整个树来查找id。或者,您可以使用地图快速查找节点

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


    我是从语言不可知论的角度来回答这个问题的。这是一个没有任何限制的树结构,所以实现并没有那么流行。

    我认为B-tree是满足您需求的一种方式。

    第1,2,3点:B-树本质上支持这一点。(多个子项,唯一的父项,允许插入/删除元素

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

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

    Pont 7,8:这不是一个问题,因为您提到您只有数百条记录。尽管B-树对于外部磁盘存储也是相当好的数据结构。

    看看GoLLRB(您列出的第一个包).我和其他许多人一样,经常使用它,而且它很好。如果它能处理你需要的一切,那么我认为你应该使用它。