高效的编码帮助

时间:2009-05-08 14:22:37

标签: c++ pointers

我目前正在用C ++编写代码来查找6个整数的所有可能排列并存储最佳排列(即总数最接近给定值的排列)。

我正在尝试尽可能高效地编写此代码,并且会提供任何建议或示例。

我正在考虑将整数存储在数组中并使用循环内的指针执行排列。这是一个好方法吗?

4 个答案:

答案 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 WheelExhaustively Enumerating Combinations and Permutations in Code。它有完整的代码,由一位同事SO'r编写,它应该足以让你走上正确的轨道。

答案 2 :(得分:1)

假设重复的数字不是问题,那就有n! n个整数的计算(一次取n)。所以无论你做什么,你的算法都会有阶乘时间行为(O(n ^ n))。

换句话说,当n变大时,它会。遗憾。

实际上有一些算法可以在permutation wikipedia页面上执行此操作。

答案 3 :(得分:0)

  

我在考虑存储整数   在一个数组并执行   使用指针内的指针排列   环。这是一个好方法吗?

不,这不是一个好方法。而不是交换指向数组中项目的指针,而是交换数组中的项目。指针只是一个没有任何实际目的的间接的额外步骤。