0

たとえば、軸が1から1000(または同等に0から999)で実行される3次元グリッド/配列があると仮定します。この配列には1000^3個の要素があります。

Javaを使用して、0から1000^3の範囲の単一の整数を決定論的な方法でこの配列にマップしたいと思います。好ましくは、このソリューションは任意の次元Nで機能します。

このような関数の疑似コディッシュの例を次に示します。

public Vector<int> nthElement( Vector<int> dims, int n )

したがって、nthElement([1000, 1000, 1000], 0)それを返すように[0, 0, 0]呼び出すと、。nthElement([1000, 1000, 1000], 1001)のようなものが返されます[999, 1, 0]

解決策は、私の例のように3次元ではなく、N次元である必要があります。

4

4 に答える 4

3

これは正しいマッピングアルゴリズムです。

map([X, Y, Z, T, ...], N) = [
    N mod X, 
    N div X mod Y, 
    N div X div Y mod Z, 
    N div X div Y div Z (mod ...)?
    ...
]

または再帰的

map([X, Y, Z, T, ...], N) = [N mod X, map([Y, Z, T, ...], N div X)]

ここで、A div BはFloor(A / B)です。

于 2010-12-23T12:10:30.743 に答える
1

できるよ:

a = Number % (1000 * 1000)
b = (Number / 1000) % 1000
c = Number / (1000 * 1000)

それはマッピング(ユニーク)であり、あなたは単に逆を行うことができます

注2/3=0ではなく.6666

于 2010-12-23T12:13:33.763 に答える
1

これをチェックして

List<Integer> nthElement( List<Integer> dims, int n ){
    List<Integer> res = new ArrayList<Integer>(dims.size());
    for(Integer cur  : dims){
        if(n <= 0 ){
            res.add(0);
        } else {
            n -= cur;
            res.add(n >= 0 ? cur -1  : cur + n );
        }
    }
    return res;
}

使用例の更新

    //create list with 3 dimensions using Guava
    List<Integer> dims = ImmutableList.of(1000, 1000, 1000);
    //or with standard JDK
    //List<Integer> dims = new ArrayList<Integer>(3);dims.add(1000);dims.add(1000);dims.add(1000);

    System.out.println(nthElement(dims, 0));
    System.out.println(nthElement(dims, 1000));
    System.out.println(nthElement(dims, 1001));
    System.out.println(nthElement(dims, 2001));

印刷します

    [0, 0, 0]
    [999, 0, 0]
    [999, 1, 0]
    [999, 999, 1]
于 2010-12-23T12:22:18.360 に答える
0

おそらく探しているのは、Cantorの対関数です。NxN用に定義されているため、任意の大きな寸法に使用できます。ウィキペディアのページで述べたように、それは次元nの配列に帰納的に一般化することができます。あなたの場合、n=3は問題なく機能します。

上記のページでは、関数の反転についても説明しているため、指定された数値から配列内の座標を取得できます。これは、で必要なものですnthElement

もちろん、Cantorは、2次元フィールドを歩くための1つの可能な方法しか定義していません。他にも可能な散歩がありますが、これが最も人気のある方法です。

編集:配列の次元が長方形の場合、Cantor対関数は最大の種類の次元を想定することに注意してください。そのため、関連付けられた番号は配列内に連続して存在しなくなります。F.ex. サイズ1000x2の配列は、1000x1000配列として扱われ、実際の配列のエントリに対応する番号は、0..1000*1000の番号の連続しないリストになります。ただし、3つの次元が常に同じである場合、この点は完全に無視できます。

コメントへの応答:行ごとのペアリングとCantorのペアリングは、マトリックス空間をウォークスルーするためのまったく異なる方法です。Cantorペアリングの利点は、自然数に対して定義されるため、行列の次元に正確な値がない場合、または行列が時間の経過とともに大きくなる場合にも適用できることです。

于 2010-12-23T12:12:48.893 に答える