在排序列表中查找项目的索引

时间:2013-11-06 16:35:45

标签: algorithm sorting

我们有一个生成的列表:

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

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

如何在不计算它们的情况下找到组合的位置? 防爆。 201 - >索引= 8 提前谢谢。

4 个答案:

答案 0 :(得分:4)

如果你的号码是ABC,那么索引是:

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

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

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

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

答案 1 :(得分: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

答案 2 :(得分: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
  11. 如果最大数字是 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
    36. 可以从第一列或最后一列看到总条目,在k+1的情况下,它是三角形编号k=4的三角形编号。对于k=3,它只是k+1的三角形。

      Triangle-triangle numbers

      没有将其解决,但该模式可能表示随着位数的增加而连续求和。

      还有一种模式:

      k=3

      Triangle numbers

      k=4

      Triangle squared?

      k=5

      Triangle cubed?

      或者一般来说,长度 k 序列中的条目总数:

      Summation sequence total entries

      这些知识有助于我们找到第一个数字的标量,其余问题实际上是k-1的子问题。此刻击败我......

答案 3 :(得分:0)