整数数组算法的排列

时间:2014-03-14 13:23:09

标签: java algorithm permutation

有一组例如(1,4,2,5,7,6,9,8,3)。我们通过以下方式计算其first difference(FD):firstDifference[i] = inputArray[i+1] - inputArray[i]。 inputArray是原始集。在示例中,情况是(1,4,2,5,7,6,9,8,3)。 firstDifference是通过以下方式从inputArray创建的:(inputArray的第二个元素) - (inputArray的第一个元素)依此类推。

因此给定集合的FD是(3,-2,3,2,-1,3,-1,-5)。任务是找到给定集合的多个排列,其中第一个差异是FD的排列。在示例情况下,我们应该找到(1,4,2,5,7,6,9,8,3)的这种排列,即第一个差异是(3,-2,3,2,-1,3, - 的排列)。 1,-5)。

这是我的算法:

  1. 查找给定集的所有排列。
  2. 找到给定集合的FD。
  3. 在我们的集合中查找排列的所有第一个差异。
  4. 仅选择此类集合,其中第一个差异包含给定集合的FD数量。数数吧。
  5. 但是这个算法太慢了。你能帮助创建更快的算法吗?可能我做了一些可以消除的步骤?

2 个答案:

答案 0 :(得分:3)

答案 1 :(得分:0)

这是一个很大的问题...如果我理解你,你需要找到原始集的所有排列,以保持原始FD集的排列。

您的算法将起作用,除非您通过查看原始集的所有排列然后查看这些FD的所有排列来计算大量不必要的排列。如果您首先查看原始FD的所有可能排列,您应该能够消除原始集合的一堆排列。

换句话说:

  1. 计算原始FD
  2. 查找原始FD的所有可能排列
  3. 然后线性地开始计算原始集合的排列,但消除那些无法立即计算的排列。
  4. 例如:

    设置{1,2,3,5} FD {1,1,2}

    在计算此示例时,当您进入步骤3时,您应该能够自动消除以1,5开头的任何排列,因为4的差异永远不会出现在原始FD的任何排列中。它只会在这个特定的例子中保存一些计算,但是一旦你开始使用更大的集合,这个算法就有可能为你节省大量的时间。