我目前正在用C ++编写代码来查找6个整数的所有可能排列并存储最佳排列(即总数最接近给定值的排列)。
我正在尝试尽可能高效地编写此代码,并且会提供任何建议或示例。
我正在考虑将整数存储在数组中并使用循环内的指针执行排列。这是一个好方法吗?
答案 0 :(得分:14)
他们已经为你想到了这个:
#include <algorithm>
int ra[6] = { 1, 2, 3, 4, 5, 6 };
do {
// whatever
} while (std::next_permutation(ra, ra+6));
请注意,元素必须以递增的顺序开始(通过运算符&lt;进行比较),否则循环将在您看到每个排列之前终止。有关详细信息,请参阅http://en.cppreference.com/w/cpp/algorithm/next_permutation。
它可能无法提供最快的运行时间,因为在每一步都必须检查数组以确定要更改的内容。但它在程序员工作中肯定是最有效的,并且在不知道编译器和平台的情况下,无论如何都不可能微观优化嵌套循环方法。
答案 1 :(得分:3)
看看这篇优秀的帖子@ Coding the Wheel:Exhaustively Enumerating Combinations and Permutations in Code。它有完整的代码,由一位同事SO'r编写,它应该足以让你走上正确的轨道。
答案 2 :(得分:1)
假设重复的数字不是问题,那就有n! n个整数的计算(一次取n)。所以无论你做什么,你的算法都会有阶乘时间行为(O(n ^ n))。
换句话说,当n变大时,它会慢。遗憾。
实际上有一些算法可以在permutation wikipedia页面上执行此操作。
答案 3 :(得分:0)
我在考虑存储整数 在一个数组并执行 使用指针内的指针排列 环。这是一个好方法吗?
不,这不是一个好方法。而不是交换指向数组中项目的指针,而是交换数组中的项目。指针只是一个没有任何实际目的的间接的额外步骤。