从"平面阵列计算三角矩阵指数"指数?

时间:2015-09-29 11:42:15

标签: algorithm performance pseudocode

得到一个表示为平面数组的三角矩阵

undefined

使用原始索引计算索引对的最快方法是什么? 一种方式(天真蛮力)就是这样计算:

0 = [0, 0]
1 = [1, 0], 2 = [1, 1]
3 = [2, 0], 4 = [2, 1], 5 = [2, 2]
6 = [3, 0], 7 = [3, 1], 8 = [3, 2], 9 = [3, 3]

有没有一种方法可以立即实施?

3 个答案:

答案 0 :(得分:1)

每行中的第一个数字nr*(r+1)/2,其中r是行号。求解n = r*(r+1)/2等式,你就得到了这个正r个根:

r = (sqrt(1+8*n)-1)/2

因此,要获得任意n的行号,您应该向下舍入结果:

r = floor(sqrt(1+8*n)-1)/2

现在列号可以在n和第一个数字之间找到差异:

c = n - r*(r+1)/2

以下是Java中的示例代码:

public static void foo(int n) {
    int r = (int) Math.floor((Math.sqrt(8 * n + 1) - 1) / 2);
    int c = n - r * (r + 1) / 2;
    System.out.println("n = " + n + "; r = " + r + "; c = " + c);
}

答案 1 :(得分:1)

对于输入n,可以使用以下命令找到答案:

k = (int)(((int)(sqrt(8*n + 1)) - 1)/2)

l = (int)(n - (k * (k+1) /2 ))

答案:

(k,l)

答案 2 :(得分:0)

这是一个选项,可能不是最好的(只是为了表明我已经考虑过这个):

它是对单调递增函数的二元搜索:

void bar(uint n) {
    uint i = 1;
    while (n >= i * (i + 1) / 2) {
        i <<= 1;
    }
    i >>= 1;
    uint stepSize = i >> 1;
    while (stepSize) {
        uint tmp = i + stepSize;
        if (n >= tmp * (tmp + 1) / 2) {
            i = tmp;
        }
        stepSize >>= 1;
    }

    cout << n << " = " 
         << "[" << i << ", " << (n - i * (i + 1) / 2) << "], ";
    if (i == n - i * (i + 1) / 2) {
       cout << std::endl;
    }
}