【问题标题】:Dont know how to solve a maybe infinitfe loop (Tree) [closed]不知道如何解决可能的无限循环(树)[关闭]
【发布时间】:2013-07-31 19:28:49
【问题描述】:

我有问题。 我有一个元素和另一个元素列表,它们以某种方式连接到第一个元素。 我想检查一下,列表中的哪些元素是第一个的子元素。将结果保存在数组中。然后我会挑选第一个孩子并寻找他的孩子。保存,等等等等。 问题是,我不知道确切的关系数量。所以我可以有很多循环和搜索。 我需要对每个循环和数组进行编程(保存到)还是有更好的方法?

编辑: 我说的是数据库表。我有两张桌子。我想检查表 1 中每个元素的子项(表 2 中的数据)。所以我从表 1 中的循环开始。表 1 和表 2 中的元素与坐标 xy 相连。所以我正在搜索 table2 中的所有元素,其中 table1_element1.xy == table2.xy。结果可能有n个孩子。现在我想保存它们并为这些孩子开始一个新的循环,以根据坐标为每个孩子找到他的孩子。保存那个新结果等等。 更清楚?

谢谢。

【问题讨论】:

  • 你的输入不清晰,你的输出不清晰。用输入数据的描述替换“以某种方式”...
  • 您为 Java、C++ 和 PL/SQL 标记了这个。我怀疑您并没有真正使用三种程序语言来解决这个问题。请编辑帖子,按照@opi 的要求对其进行改进,并删除不适用的标签。谢谢。
  • 您可以使用 SQL 执行此操作。查看“分层查询” - 通常数据在一个带有父列的表中。但也许你可以在你的两个表上创建一个视图,然后使用 HQ 一次获取所有数据。

标签: plsql plsqldeveloper


【解决方案1】:

这个问题可以借助递归轻松解决。

在这种情况下,您的终止条件将是当任何节点在列表中没有任何关系时,或者当您到达存储子节点的列表末尾时。

谢谢

【讨论】:

  • 好的。对于不习惯编程的人。什么是递归,它是如何工作的。
  • 在某种伪代码中,recusion 可能如下所示:void doStuff(T source){ T childs[] = source.getChilds(); for(child : childs){ doStuff(child); }} 实际上,您只需使用相同的代码,直到您用完子代码(走下所有树)。 en.wikipedia.org/wiki/Recursion
【解决方案2】:

虽然这个问题有点模糊,但不是对每个单独的循环进行编程,更优雅的编写方式是通过递归。您可以将休息条件设置为当您找到没有关系的孩子(如果我正确理解问题)时。

至于存储问题,听起来您可能希望使用某种形式的拓扑数据结构,其中每个节点将保存通过您的关系连接到它的所有节点的列表。

希望这会有所帮助。

【讨论】:

  • 你能解释一下我的递归是如何工作的吗?
  • 我不会重复一个答案,而是将你指向一个answer,这个已经存在并且可能比我解释它的方式更好。任何其他问题,请告诉我。
猜你喜欢
  • 1970-01-01
  • 2015-03-23
  • 1970-01-01
  • 2012-03-06
  • 1970-01-01
  • 2013-08-23
  • 2020-05-18
  • 2022-01-06
  • 1970-01-01
相关资源
最近更新 更多