Как я могу разобрать свой код построения дерева 3D-сегмента? - PullRequest
0 голосов
/ 31 марта 2019

Я пытаюсь понять, как применить код дерева 2D-сегмента для более высокой размерности, особенно для 3D. Потому что в уроках сказано, что деревья 2D-диапазона могут быть легко преобразованы в более высокие измерения. Что я делаю не так?

Мой код указан ниже:

private void build_Y(int vz, int lz, int rz, int vx, int lx, int rx, int vy, int ly, int ry, int a[][][]){
    if (ly == ry){
        if (lx == rx && lz == rz){
            t[vz][vx][vy] = a[lz][lx][ly];
        }
        else if (lx == rx && lz != rz){
            t[vz][vx][vy] = t[2 * vz][vx][vy] + t[2 * vz + 1][vx][vy];
        }
        else if (lx != rx && lz == rz){
            t[vz][vx][vy] = t[vz][2 * vx][vy] + t[vz][2 * vx + 1][vy];
        }
        else if (lx != rx && lz != rz){
            t[vz][vx][vy] = t[2 * vz][2 * vx][vy] + t[2 * vz + 1][2 * vx + 1][vy];
        }
    }else{
        int vmiddleY = (ly + ry) / 2;
        build_Y(vz, lz, rz, vx, lx, rx,2 * vy, ly, vmiddleY, a);
        build_Y(vz, lz, rz, vx, lx, rx,2 * vy + 1, vmiddleY + 1, ry, a);
        t[vz][vx][vy] = t[vz][vx][2 * vy] + t[vz][vx][2 * vy + 1];
    }
}

public void build_X(int vz, int lz, int rz, int vx, int lx, int rx, int a[][][]){
    if (lx != rx){
        int vmiddleX = (lx + rx) / 2;
        build_X(vz, lz, rz, 2 * vx, lx, vmiddleX, a);
        build_X(vz, lz, rz, 2 * vx + 1, vmiddleX + 1, rx, a);
    }
    build_Y(vz, lz, rz, vx, lx, rx, 1, 0, 2, a);                    
}

public void build_Z(int vz, int lz, int rz, int a[][][]){
    if (lz != rz){
        int vmiddleZ = (lz + rz) / 2;
        build_Z(2 * vz, lz, vmiddleZ, a);
        build_Z(2 * vz + 1, vmiddleZ + 1, rz, a);
    }
    build_X(vz, lz, rz, 1, 0, 2, a);
}

Тестовый массив:

    int[][][] a = {
            { {0, 1, 0}, {0, 0, 1}, {1, 0, 1} },
            { {0, 1, 0}, {0, 0, 1}, {1, 0, 1} },
            { {0, 0, 0}, {0, 0, 1}, {1, 0, 1} },
    };

Мой код дает мне результат общей суммы = 6, но должен быть 11.

...