【问题标题】:Algorithm to remove childs from array从数组中删除子元素的算法
【发布时间】:2013-06-26 05:07:24
【问题描述】:

我必须为我的项目写一个algorithm。以下是问题

一种树状结构,仅公开一个功能,即**getAllChildNodes**,它返回特定节点的所有子节点。 现在我得到了一个 Nodes 数组,我只需要保留其中最顶层的父节点。

示例:假设有 3 棵树

Tree 1 : P1 has two children C11 & C12

Tree 2 : P2 has 1 children C21, and C21 has 2 child C22, C23

Tree 3 : P3 has 2 Children C31 and C32

Now if given an array say { C11, C21, C22 , P1, P3, C32}
 The expected result is { C21, P1 , P3 }

如果我需要更多信息,请告诉我。

更多信息: 我首先获取数组第一个元素的所有子元素,然后与数组的其余元素进行比较,并且与每个元素类似。但这有更多的复杂性..即n * n * getAllChildNodes。我来这里是为了更好的建议

【问题讨论】:

  • 我正在尝试首先获取数组第一个元素的所有子元素,然后与数组的其余元素进行比较,但这更复杂..即 nn i>getAllChildNodes。我来这里是为了更好的建议
  • 你能得到另一个函数,比如getParentNode(childNode)吗?如果你能得到它,那么只需拥有所有子节点的 parentNodes 并简单地删除重复项。
  • 没有这种方法可用

标签: java arrays algorithm data-structures tree


【解决方案1】:

选择数组的第 i 个元素并将其所有子元素添加到 hashmap(使用给定函数)。对 i 1 到 n 执行此操作(完全通过)

从 1 到 n 循环 i 并且对于每次迭代,检查元素是否存在于 hashmap 中。

如果存在,将其从数组中删除,

继续

注意检查元素是否属于hashmap的顺序是O(1),加法的顺序是O(1),平均。所以算法是 O(n*getAllChlidNodes) 平均

【讨论】:

  • 你需要先完成通过
  • 是的,顺序相同,O(nk)+O(nk)=O(nk)
  • 但是我认为你忘记在你的算法中考虑它所以它不会是正确的,对吧?
  • 是的,具体取决于实现,但请阅读问题,它明确指出只公开了一个功能
  • 如果还有其他问题请留言。否则,如果您接受答案,将不胜感激
【解决方案2】:

您可以轻松做到这一点。 首先创建一个方法isPresent(node) 来检查您输入的节点是否存在于数组中。然后输入给定的每个节点以查找其父节点。

if(isPresent(x->parent)) push(x->parent);

对整个列表继续此操作。 现在recursively 检查current list 是否有任何parents present。一旦你开始做,你就会得到它。如果有任何父母只是pop() 这些元素。 希望这会有所帮助:)

【讨论】:

  • 算法的主要目的是不使用自定义函数,如查找父,据我可以从问题中推断。问题说只有 getAllChildNodes 被公开。
【解决方案3】:

如果你可以先得到一个像 getParentNode(childNode) 这样的函数,或者创建子作为键和父作为值的映射/多重映射作为预处理步骤,那么问题将变得非常容易。

如果你有 getParentNode(childNode) 则只需遍历数组并将父母推入集合。

如果您将子映射/多重映射作为键,父作为值作为预处理步骤,则应用adi 提到的算法

【讨论】:

  • 对不起,我没有任何功能来获取 ParentNod
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-14
  • 2011-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多