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

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

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

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

【问题讨论】:

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

标签: c++ pointers


【解决方案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 中的指针进行排列 环形。这是一个好方法吗?

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-15
        • 2015-03-30
        • 1970-01-01
        相关资源
        最近更新 更多