计算数字组合的索引

时间:2016-09-06 16:02:14

标签: algorithm math indexing

我有一个向量,其中包含一个较大的 n 数字组中的两个数字的每个可能组合的值(从0到( n -1)) ,不包括两个数字相同的组合。 例如,如果 n = 4,则组合将显示在 number1 number2 列中。

    number1  number2 vector-index value
    0        1       0             3
    0        2       1             98
    0        3       2             0
    1        0       3             44
    1        2       4             6
    1        3       5             3
    2        0       6             2
    2        1       7             43
    2        3       8             23
    3        0       9             11
    3        1       10            54
    3        2       11            7

始终有n*(n-1)个组合,因此这是向量中的元素数量(上例中的12个元素)。

问题

为了访问向量中的值,我需要一个表达式,允许我找出每个组合的相应索引号。 如果包含 number1 = number2 的组合,可以使用以下方式计算索引号:

    index = number1*(n-1)+number2

This question是相关的,但也包含 number1 = number2 的组合。

在这种情况下是否有任何表达式来计算索引?

2 个答案:

答案 0 :(得分:2)

首先,请注意所有对都可以分组为大小的块(n-1),其中n是不同索引的数量。这意味着给定一对(i,j),包含它的块的索引将是i(n-1)。在该块内,索引按顺序排列,跳过索引i。如果j <我,然后我们只是看看块的开始j步。否则,我们会看过去的j-1步。总的来说,这给出了公式

int index = i * (n - 1) + (j < i? j : j - 1);

答案 1 :(得分:0)

请注意,唯一的区别是当number2大于number1时,如果发生这种情况,会跳过number2序列中的值,因此您需要减少计数,例如这样:

index = number1 * (n - 1) + number2 - (number2 > number1 ? 1 : 0)