高效的编码帮助

Posted

技术标签:

【中文标题】高效的编码帮助【英文标题】:Efficient coding help 【发布时间】:2009-05-08 14:22:37 【问题描述】:

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

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

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

【问题讨论】:

关于 SO 中的排列有很多问题。请搜索“排列”,您会得到答案;也许它们不是您使用 (C++) 编写的相同语言或相同的结构(即使用字符串),但您将能够适应。 【参考方案1】:

他们已经为你想好了这个:

#include <algorithm>

int ra[6] =  1, 2, 3, 4, 5, 6 ;

do 
    // whatever
 while (std::next_permutation(ra, ra+6));

请注意,元素必须以升序开始(通过运算符http://en.cppreference.com/w/cpp/algorithm/next_permutation。

它可能无法提供最快的运行时间,因为在每一步它都必须检查数组以找出要更改的内容。但它肯定是程序员工作中最有效的方法,而且在不了解编译器和平台的情况下,无论如何都不可能对嵌套循环方法进行微优化。

【讨论】:

【参考方案2】:

看看这篇出色的帖子@Coding the Wheel:Exhaustively Enumerating Combinations and Permutations in Code。它有完整的代码,由SO'r 的同事编写,应该足以让你走上正轨。

【讨论】:

【参考方案3】:

假设重复的数字不是问题,有 n! n 个整数的排列(一次取 n 个)。因此,无论您做什么,您的算法都将具有阶乘时间行为( O (n^n) )。

换句话说,当 n 变大时,它会变慢。对不起。

permutation wikipedia 页面上实际上有执行此操作的算法。

【讨论】:

幸好n是6,所以算法是O(720) ;-)【参考方案4】:

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

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

【讨论】:

以上是关于高效的编码帮助的主要内容,如果未能解决你的问题,请参考以下文章

高效编码之Lombok

高效编码之Lombok

高效编码深入TestNG体验了一把,真爽

高效编码深入TestNG体验了一把,真爽

高效编码超全面的,超正的单元测试框架Junit的使用姿势

高效编码超全面的,超正的单元测试框架Junit的使用姿势