2

我们有一个生成的列表:

1. 003
2. 012
3. 021
4. 030
5. 102
6. 111
7. 120
8. 201
9. 210
10. 300

(数字从 0 到 3,它们的总和是 3)

如何在不计算它们的情况下找到组合在什么地方?前任。201 -> index=8 在此先感谢。

4

4 回答 4

4

如果您的号码的数字是 ABC,那么索引是:

ndx = A * (8 - A + 1) / 2 + B + 1;

例如,对于值 ABC=201,我们将有:

ndx = 2 * (8 - 2 + 1) / 2 + 0 + 1 = 8; 

实际上,值 201 的索引为 8。

于 2013-11-06T17:32:17.307 回答
1

不是一个完整的答案,但我认为这是一个好的开始。

如果您将每个数字视为两个二进制数字,您会得到:

 1. 003  00 00 11
 2. 012  00 01 10
 3. 021  00 10 01
 4. 030  00 11 00
 5. 102  01 00 10
 6. 111  01 01 01
 7. 120  01 10 00
 8. 201  10 00 01
 9. 210  10 01 00
10. 300  11 00 00

如果忽略右侧的数字列,则前七项(值 003 到 120)是数字 0 到 6 的二进制表示。

接下来的两项具有值 8 和 9,最后一项是 12。

因此,我们可以将数字转换为粗略索引:

ix = 4*first_digit + second_digit

然后调整:

if (first_digit < 2)
    ix = ix + 1
else if (first_digit == 3)
    ix = ix - 2

我对那里的条件不满意。有没有一种数学方法可以进行这种翻译:

0 => 1
1 => 1
2 => 0
3 => -2
于 2013-11-06T17:26:23.817 回答
1

对,我一直在做的问题下的评论是假设您想直接从当前值转到索引,而不执行搜索。也就是说,对条目的数字进行一些检查并将其转换为 1 索引的数字。

请注意,这个答案是定向且不完整的,只是显示了我解决问题的方式。

查看您的示例,如果我们将每个条目视为由 3 位数字(z_i, y_i, x_i)组成,那么您将获得以下序列:

  1. 003; z=0, y=0, x=3
  2. 012; z=0, y=1, x=2
  3. 021; z=0, y=2, x=1
  4. 030; z=0, y=3, x=0
  5. 102; z=1, y=0, x=2
  6. 111; z=1, y=1, x=1
  7. 120; z=1, y=2, x=0
  8. 201; z=2, y=0, x=1
  9. 210; z=2, y=1, x=0
  10. 300; z=3, y=0, x=0

如果最大位数为k (=3),则:

x_i = 3, 2, 1, 0, 2, 1, 0, 1, 0, 0 = k, k-1, ..., 0, k-1, ... 0, ......, 0

y_i = 0, 1, 2, 3, 0, 1, 2, 0, 1, 0 = 0, 1, ..., k, 0, ..., k-1, ......, 0

z_i = 0, 0, 0, 0, 1, 1, 1, 2, 2, 3 = k+1 x 0, k x 1, ......., 1 x k

如您所见,y_i数字按顺序重复上升,在每次完成时将z_i向上敲。

如果你有更多的数字,模式会变得更复杂,但仍然遵循类似的模式。

对于k=4

  1. 0004
  2. 0013
  3. 0022
  4. 0031
  5. 0040
  6. 0103
  7. 0112
  8. 0121
  9. 0130
  10. 0202
  11. 0211
  12. 0220
  13. 0301
  14. 0310
  15. 0400
  16. 1003
  17. 1012
  18. 1021
  19. 1030
  20. 1102
  21. 1111
  22. 1120
  23. 1201
  24. 1210
  25. 1300
  26. 2002年
  27. 2011
  28. 2020
  29. 2101
  30. 2110
  31. 2200
  32. 3001
  33. 3010
  34. 3100
  35. 4000

总条目可以从第一列或最后一列看出,它是 的三角形数的三角形数k+1,在 的情况下k=4。因为k=3,它只是 的三角形k+1

三角-三角数

没有计算出来,但是随着位数的增加,这种模式可能表明连续的求和。

仍然有一个模式:

k=3

三角形数字

k=4

三角平方?

k=5

三角形立方体?

或者通常对于长度为k的序列中的条目总数:

求和序列总条目

这些知识帮助我们找到第一个数字的标量,剩下的问题实际上是 的子问题k-1。暂时打败我...

于 2013-11-06T19:15:56.300 回答
0

使用Collections.binarySearch.

检查http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#binarySearch(java.util.List , T)

于 2013-11-06T16:55:12.727 回答