【问题标题】:Loop through all combinations of a multiset elements循环遍历多集元素的所有组合
【发布时间】:2015-04-14 14:22:40
【问题描述】:

我需要在一棵树中找到最佳路径,这棵树是multiset 元素的所有可能组合。 例如对于这个multiset:A - B - C,树将由所有 6 种可能的组合组成: A - B - C | A - C - B | B - A - C | B - C - A | C - A - B | C - B - A

我想仅使用多重集循环遍历这棵树,

类似这样的:

// I think this must be initialized, but that is not a problem
Path bestPath;

for (mySet::iterator i(aSet.begin()), e(
                    aSet.end()); i != e; ++i) {  
         Path path = someRecursiveFunction(*i);
         if(criteria(bestPath,path))
              bestPath = path;
         return bestPath;
}

someRecursiveFunction 可能是相同的,但是在其余的值上循环,我不想在每个节点中创建一个多重集并将其余的放在上面,因为节点的数量是因子的大小多组, 我找不到这样做的好方法......

【问题讨论】:

  • 树是特定形式的图。一个图由两组定义——一组顶点和一组边。您已经描述了一组:“multiset 元素的所有可能组合”。这两个集合中的哪一个,另一个集合是如何定义的?
  • 另外,当您说“最佳路径”时 - 哪个顶点和哪个其他顶点之间的路径,以及根据什么标准“最佳”(给定两条路径,您如何确定一个路径是否优于其他)?
  • 我编辑了问题以显示树的示例,树的组成如下,首先是根(不代表任何内容),然后是所有元素,然后对于每个节点,我们将所有元素,但他的父母,我希望这就是边缘的意思
  • 'path' 必须是一个允许我检索路径的结构,它包含从实际节点(他的孩子)中找到的最佳路径,并且标准是一个返回布尔值的函数,具体取决于我需要什么(你不想知道我的标准)

标签: c++ algorithm tree multiset


【解决方案1】:

如下创建一个 std::vector std::vector<char> set ={A,B,C} 并在向量顶部调用 std::next_permutation 以获取所有排列

std::next_permutation( std::begin(set), std::end(set));

do {
    //your code for algorithm
    for( auto & x : set)
      std::cout<<x<<" ";
    std::cout<<"\n";
  } while( std::next_permutation( std::begin(set), std::end(set));

【讨论】:

  • 我可以在多集上使用它吗?
  • @Othman: std::next_permutation 修改范围,所以不能直接和multiset一起使用(这就是为什么你必须复制到std::vector)。
猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 2022-11-20
  • 2022-01-27
  • 2012-11-03
  • 2017-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多