【问题标题】:Optimal way to create a tree with the following conditions创建具有以下条件的树的最佳方法
【发布时间】:2015-12-30 22:59:51
【问题描述】:

Expected tree for given array 给定一个包含 n 个元素的数组,创建一棵树,使得从根到叶的所有路径标签代表长度为“n”的数组元素的所有组合。 例如,如果数组 = {1,2,3},那么树应该是这样,从根到叶有 6 条路径,每条路径如下 {{123},{132},{213},{231}, {312},{321}} 1

【问题讨论】:

  • 根值要改吗?或者创建一个虚拟根并从级别 1 开始解析?
  • 是的,创建一个虚拟根,然后每个边缘标签都从数组中获取一个值...希望我很清楚...
  • 您确实意识到此类树中的节点数将是 O(n!) 对吧?所以即使是小的 n 也很难处理,更不用说 10^9。
  • 你需要这棵树还是仅仅递归遍历所有可能性就足够了?
  • @ElKamina - 是的! ,我基本上想以 BFS 方式遍历这样的树。让我们将“n”的值保持在一个较低的值,比如 10。我想知道找到我的子节点的边缘标签对于任何给定级别的任何给定节点的最佳方法。现在,如果我确实想要更高的 'n' 值,有什么可以实施的吗?

标签: algorithm optimization data-structures tree


【解决方案1】:

由于列表可能包含重复项,您需要对它们进行重复数据删除并保持计数。为了避免混淆,让我们使用字母而不是数字。

现在,让我们说 {a, a, b, b, b} 是您的输入。

将其转换为类似于 {a:2, b:3} 的数据结构(您可以通过使用映射或元组来实现)

算法:

初始化:创建根节点

输入:data = {a:2, b:3} 和节点

为节点创建 k = size(data) 子节点。

将数据中的每个键分配给每个新边(在本例中为 a 和 b)。

对于每个孩子递归调用此函数,并删除相应的边缘值。示例:对于 a 对应的函数调用,您将传递 data = {a:1, b:3} 而对于 b,data = {a:2, b:3}

每当一个值变为 0 时,从数据中删除相应的键。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 2012-01-14
    • 2015-09-09
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 2016-02-23
    相关资源
    最近更新 更多