【问题标题】:Construct a tree from edges从边构造一棵树
【发布时间】:2013-02-20 02:30:20
【问题描述】:

如果我试图构建一个给定输入的树,每行一条边,其中一条边由它连接的两个顶点表示。是否可以使用 Node 结构/类来构造树,还是应该像使用图形一样将其表示为邻接列表?

我遇到的主要问题是输入的顺序。如果给我两个或多个起初根本没有连接的边,那么我有一堆没有连接的 Node 对象,而通常给你一棵树并插入树中只是使新节点成为子节点(或父节点?)另一个节点。

【问题讨论】:

  • 对于您提出的问题:您似乎可以从边缘检测节点,不是吗?我的意思是,如果边标识两个顶点,那么边不就是顶点吗?
  • 不理解这个“如果我得到两个或多个起初根本没有连接的边”。边缘应该连接吗?无论如何,如果您提前知道顶点的数量,您应该使用邻接列表。它既简单又节省内存。
  • 对于你没有问的问题:你需要检测你是否已经识别了节点。我不是绘图专家,但您需要考虑如何维护地图。如果只是一堆相互链接的节点,你能不能维护第二个结构,比如桶树,这样你就可以快速识别是否已经记录了一个节点?
  • @atk:我可以从边缘知道顶点,但我不知道如何在中间步骤中存储顶点。
  • @Duc:我的意思是,如果树的一个部分的边缘在树的不同部分的边缘之后给出。它们将是两条边和四个顶点。我将如何存储这个?我通常只有一个根节点。稍后我将希望以常用方式(中序/预序等)遍历树,这需要访问某些根节点,因此我想以与通常方式类似的方式存储它,但如何连接未连接的节点?

标签: java algorithm graph tree


【解决方案1】:

如果您担心如何存储多个节点而不是一个根节点,一种方法是拥有一个包含 N 个指向 Node.js 的指针的数组。假设每个节点的索引为 0 到 N - 1,其中 N 是树中的节点数,您可以将第 i 个 Node 指针存储在数组的第 i 个元素中。

如果您将在堆栈中一次分配 N 个节点的数组(在 C/C++ 中),而不是使用指针,则这种方法会更加有益。这是内存分配时间的巨大改进。

【讨论】:

    【解决方案2】:

    您是否考虑过利用 Neo4j 等图形数据库技术来存储节点和边?它是可嵌入的。

    我已经在 scala 上广泛使用嵌入式 orientdb 和 tinkerpop 蓝图来进行图形算法。我建议您查看这些技术,因为它们使这些问题和图算法构建变得微不足道。

    属性图数据库使用索引来允许查找类型,因此您可以找到一个节点并从那里开始遍历图。无需重新发明轮子。

    主要概念是:节点、边、属性(可以存在于节点或边上。边类型(“知道”例如在社交图中)。确定边的遍历方向。以及所提到的索引,它们“键入”节点并允许查找。

    可以查询每个节点的入边或出边,并且可以检查边的类型和属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-23
      • 2018-10-24
      • 1970-01-01
      • 1970-01-01
      • 2021-08-06
      • 1970-01-01
      • 1970-01-01
      • 2017-10-27
      相关资源
      最近更新 更多