如何从多棵树中获取所有组合?

时间:2011-03-17 02:08:42

标签: tree permutation pseudocode

我不知道除了使用x嵌套for循环之外如何从x组数据中获取所有可能性,我不想这样做,因为我不知道x的值,这使得数字很可能for loops的硬编码不等于所需的循环次数。

说我有:

A:1,2,3,4
B:2,4,65,2
C:1,3,2
D:2,8

我希望从每个组中获得1个项目的每个组合(在我的代码中,我使用std::vector <myclass>),我该怎么做?有人可以发一个我可以遵循的一般伪代码吗?

1 个答案:

答案 0 :(得分:0)

如果你不知道你有多少'团体',我认为你至少有一些所有的集合?即你所有向量的数组/向量?

如果是这样,这里有一个关于什么可行的一般概念

void iterateAllCombinations(array_of_groups, current_group_index,temp_result,callback_function)
{
  current_group = array_of_groups[current_group_index]
  for each element in current_group
  {
    temp_result[current_group_index]=element
    if current_group_index>0
      iterateAllCombinations(array_of_groups,current_group_index-1,temp_result,callback_function)
    else
      callback_function(temp_result)
  }
}

this would be called in some fashion like:
iterateAllCombinations(my_groups,my_groups.length-1,new vector[my_groups.length],&do_something_with_array)

对正在发生的事情的基本解释: 当你调用该函数时,它将开始遍历'top'组中的每个项目(array_of_groups中的最后一个)。如果超出'top'的组有更多组,它将调用相同的函数,传递当前项目,并告诉它查看下一组。

下一个级别将开始浏览每个项目,并且行为方式相同。这一直持续到你到达底部组,在那里,它将把所有结果的集合传递给你将使用它们的回调函数。

当底层已经通过所有项目时,它将返回到下一级别,这仍然在其“for each”循环中。下一级别将转到下一个项目,并调用底部级别,该级别将从头开始。这种情况一直持续到最终甚至“顶级”水平都经过了每个项目。


这是伪代码,具体情况会根据您的语言而变化。 '临时结果'可以是声明和分配的前置数组(就像我在伪代码中显示的那样),或者它可以是在每次递归调用之前被推送的堆栈,然后弹出,或者它可以是数组/在每次递归调用之前复制和追加的向量。你甚至可以有一个链表,每个节点只存储在该函数调用的堆栈框架中,你只需要将'parent'的指针传递给下一级别。

如果您想要执行某项特定操作,则可以使用该特定内容替换“callback_function”。或者,如果您的语言允许,您可以将其用作迭代器/生成器,并让“回调”隐式

如果你真的讨厌递归代码,你可以编写与while循环相同的东西,但将它作为递归函数编写会更直接。