高效的编码帮助
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 中的指针进行排列 环形。这是一个好方法吗?
不,这不是一个好方法。与其交换指向数组中项的指针,不如交换数组中的项。指针只是一个额外的间接步骤,没有任何实际用途。
【讨论】:
以上是关于高效的编码帮助的主要内容,如果未能解决你的问题,请参考以下文章