1

私は PageRank の問題に取り組んでおり、コーディネートされたリスト (Coo) マトリックスを持っています。以下に示すように、マトリックスにはソース配列と宛先配列があります。すべてのソースは同じ位置の宛先を指します

int[] destination = new int[] { 5, 0, 5, 0, 5, 0, 5, 0, 2, 3, 5, 0, 3, 4 };
int[] source = new int[] { 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 5 };

ヒルベルトのような空間充填曲線が計算する順序を与えるために、エッジを前処理しようとしています。(x,y) から d への変換を (x,y) に変換するときに問題が発生します。

現在のコード:

public static void main(String[] args) {
    int n = 2;
    int[] destination = new int[] { 5, 0, 5, 0, 5, 0, 5, 0, 2, 3, 5, 0, 3, 4 };
    int[] source = new int[] { 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 5 };
    int[] d = new int[destination.length];

    for (int i = 0; i < destination.length; i++) {
        x = source[i];
        y = destination[i];

        d[i] = xy2d(n);
    }

    x = y = 0;
    for (int z = 0; z < 4; z++) {
        System.out.println("Grid:" + x);
        for (int i = 0; i < d.length; i++) {
            if (d[i] == z) {
                d2xy(n, d[i]);

                System.out.println("source: " + source[i] + " dest:" + destination[i] + " --> d:" + d[i]
                        + "--> x:" + x + ":y:" + y);

            }
        }
    }
    System.out.println();
}

static int x, y, rx, ry, s, t, d;

// convert (x,y) to d
static int xy2d(int n) {
    d = 0;
    for (s = n / 2; s > 0; s /= 2) {
        rx = (x & s) >> 0;
        ry = (y & s) >> 0;
        d += s * s * ((3 * rx) ^ ry);
        rot(s);
    }
    return d;
}

// convert d to (x,y)
static void d2xy(int n, int d) {
    t = d;
    x = y = 0;
    for (s = 1; s < n; s *= 2) {
        rx = 1 & (t / 2);
        ry = 1 & (t ^ rx);
        rot(n);
        x += s * rx;
        y += s * ry;
        t /= 4;
    }
}

// rotate/flip a quadrant appropriately
static void rot(int n) {
    if (ry == 0) {
        if (rx == 1) {
            x = n - 1 - x;
            y = n - 1 - y;
        }

        // Swap x and y
        int t = x;
        x = y;
        y = t;
    }
}

コードの結果

このコードの何が問題なのかについてのアイデアはありますか? 私はグローバル変数で少しやり過ぎたことを知っています

ここからコードを取得しました

編集

配列は参照によってメソッドに入り、Java でグローバル変数を削除するために使用できることを知りました。私はまだ同じ結果を持っています

public static void main(String[] args) {
    int n = 2;
    int[] destination = new int[] { 5, 0, 5, 0, 5, 0, 5, 0, 2, 3, 5, 0, 3, 4 };
    int[] source = new int[] { 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 5 };
    int[] d = new int[destination.length];
    for (int i = 0; i < destination.length; i++) {
        int[] values = new int[] { source[i], destination[i] };
        d[i] = xy2d(n, values);
    }

    for (int z = 0; z < n * n; z++) {
        for (int i = 0; i < d.length; i++) {
            if (d[i] == z) {
                int[] values = new int[2];
                d2xy(n, d[i], values);
                System.out.println("source: " + source[i] + " dest:" + destination[i] + " --. d:" + d[i] + "--> x: "
                        + values[0] + " y:" + values[1]);
            }
        }
    }

}

// convert (x,y) to d
static int xy2d(int n, int[] values) {
    int rx, ry, s, d = 0;
    for (s = n / 2; s > 0; s /= 2) {
        rx = (values[0] & s) >> 0;
        ry = (values[1] & s) >> 0;
        d += s * s * ((3 * rx) ^ ry);
        rot(s, values, rx, ry);
    }
    return d;
}

// convert d to (x,y)
static void d2xy(int n, int d, int[] values) {
    int rx, ry, s, t = d;
    values[0] = 0;
    values[1] = 0;
    for (s = 1; s < n; s *= 2) {
        rx = 1 & (t / 2);
        ry = 1 & (t ^ rx);
        rot(s, values, rx, ry);
        values[0] += s * rx;
        values[1] += s * ry;
        t /= 4;
    }
}

// rotate/flip a quadrant appropriately
static void rot(int n, int[] values, int rx, int ry) {
    if (ry == 0) {
        if (rx == 1) {
            values[0] = n - 1 - values[0];
            values[1] = n - 1 - values[1];
        }

        // Swap x and y
        int t = values[0];
        values[0] = values[1];
        values[1] = t;
    }
}
4

0 に答える 0