【问题标题】:Permutation Algorithm with fixed sample spaces [closed]具有固定样本空间的置换算法
【发布时间】:2018-04-06 08:02:37
【问题描述】:

我有 10 个对象(n)我想要一个 C++ 代码,它可以仅在 5 个空格中打印这 10 个对象的所有排列,而不是对象的全部排列,例如在大小为 5 的数组中。

【问题讨论】:

  • 您想要算法或 C++ 代码?它们是两种不同的东西。
  • C++ 代码,如果你有,或者你可以引导我到一个有它的链接
  • 这个:en.cppreference.com/w/cpp/algorithm/next_permutation 可能是一个起点。
  • 我现在是这段代码,这段代码打印指定字符串的所有排列。我需要一个在指定数量的空间中打印排列的代码。例如,我有 10 个对象,我想一次选择 5 个对象,我需要一个代码来打印它们的排列。
  • 您可能对implementation-of-permutation-combinations-and-powerset 感兴趣,尤其是组合。

标签: c++ permutation


【解决方案1】:

下面是一些伪代码,它创建 5 个元素的每个子集并对其进行置换:

for z1 = 1:6
    for z2 = (z1+1):7
        for z3 = (z2+1):8
            for z4 = (z3+1):9
                for z5 = (z4+1):10
                    subset = [set[z1], set[z2], set[z3], set[z4], set[z5]]
                    for i = 1:(5!)
                        print(subset)
                        subset = next_permutation(subset)
                    end
                end
            end
        end
    end
end

这是一个示例代码

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> set {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    for (int z1 = 0; z1 < 6; ++z1) {
        for (int z2 = z1 + 1; z2 < 7; ++z2) {
            for (int z3 = z2 + 1; z3 < 8; ++z3) {
                for (int z4 = z3 + 1; z4 < 9; ++z4) {
                    for (int z5 = z4 + 1; z5 < 10; ++z5) {
                        std::vector<int> subset {set[z1], set[z2], set[z3], set[z4], set[z5]};
                        for (int i = 0; i < 120; ++i) {
                            for (int j = 0; j < 5; ++j) 
                                std::cout << subset[j] << " ";
                            std::cout << std::endl;
                            std::next_permutation(subset.begin(), subset.end());
                        }
                    }
                }
            }
        }
    }
    return 0;
}

您可以使用递归函数来使代码动态化,而不是 5 个循环。

【讨论】:

  • 使用std::next_permutation (do { print(subset); } while (std::next_permutation(subset.begin(), subset.end()));) 的返回而不是硬编码排列数(for (int i = 0; i &lt; 120; ++i))
  • 我不能保证 std::vector&lt;int&gt; subset {set[z1], set[z2], set[z3], set[z4], set[z5]}; 会创建按字典顺序排列的最小排列。
  • 排序一次,或对索引(副本)进行排列。
  • 我会说最好计算一次排列数(n!)而不是在每个循环中对每个子集进行排序。
猜你喜欢
  • 2011-03-21
  • 2012-04-21
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
  • 2017-08-07
  • 2014-03-23
  • 1970-01-01
相关资源
最近更新 更多