有效获得独特的数字?

时间:2015-10-02 21:50:01

标签: algorithm math

问题在于检查方程式,例如:

a * b / c + d = x

其中a - d是1 - 4的唯一数字。

现在显然你可以完成所有的可能性,然后在它有重复时跳过,但这将是O(n ^ n),当你应该能够用O(n!)解决这个问题但是我可以&#39 ;弄清楚如何。

这是否有算法?

2 个答案:

答案 0 :(得分:1)

根据您的措辞(" a - d是1 - 4 "中的唯一数字),您似乎想要的是一种用于生成集合的所有可能排列的算法数字 - 在您的情况下是集合{1, 2, 3, 4}

给定集合的大小,算法最好以递归方式实现:对于集合中的每个元素(从左到右)生成剩余元素的所有排列。请注意,一旦到达最后一个元素,显然只有一个可能的顺序。

这种方法基本上减少了找到N个项目的排列以找到N-1个项目的排列的问题。

以下是我们预期会有六种排列的{1, 2, 3}集合的样子:

{1, 2, 3}
1 | {2, 3}
1 | 2 | {3}
1 | 2 | 3
1 | 3 | {2}
1 | 3 | 2
2 | {1, 3}
2 | 1 | {3}
2 | 1 | 3
2 | 3 | {1}
2 | 3 | 1
3 | {1, 2}
3 | 1 | {2}
3 | 1 | 2
3 | 2 | {1}
3 | 2 | 1

因此,该算法为我们提供了以下六种排列:

123, 132, 213, 231, 312, 321

您可以在维基百科关于排列的文章中找到大量信息,包括permutation generation algorithms

答案 1 :(得分:0)

我没有看到任何与因子公式不同的算法来有效地解决这个问题。你没有提到在重复过程中是否应该避免使用B和C.

无论如何,我想如果不必考虑具有相同A值的D,因为,不可避免的,它们之间会有类似的结果。

我相信用最好的方法解决这个问题的方法是使用LOOKUP TABLE(尝试使用BYTE ARRAY加速),你需要找到每个重复的值来丢弃它。 / p>

再说一遍:我不考虑B和C之间的重复。