スポンサーリンク

【Java】permutation

スポンサーリンク

改善の余地しかないですが、以下で実装できます。srcは{1,2,3}のような順列を取得してほしい値の配列で、返り値がそのすべての順列結果を含んだ配列です。

ちなみに、自分の環境だとsrcの配列数が11になった時点でOutOfMemoryで死にます。順列結果をすべて保持するのは現実的ではないことが分かりました。

/**
 * @param src values to be permuted
 * @return the result of the permutation of src
 */
public int[][] permutation(int[] src){
    if(src.length <= 0){
        throw new IllegalArgumentException();
    }

    if (src.length == 1) {
        int[][] ret = new int[1][];
        ret[0] = src;
        return ret;
    }

    int[][][] resultBuf = new int[src.length][][];
    int resultSize = 0;
    for(int i = 0; i < src.length; i++){
        int finalI = i;
        int[] newSrc = Arrays.stream(src).filter(a -> a != src[finalI]).toArray();
        int[][] tmp = permutation(newSrc);
        int[][] buf = new int[tmp.length][src.length];
        for(int j = 0; j < buf.length; j++){
            buf[j] = IntStream.concat(Arrays.stream(tmp[j]), IntStream.of(src[i])).toArray();
        }

        resultBuf[i] = buf;
        resultSize += buf.length;
    }

    int[][] ret = new int[resultSize][src.length];
    int index = 0;
    for(int i = 0; i < resultBuf.length; i++){
        for(int j = 0; j < resultBuf[i].length; j++){
            ret[index++] = resultBuf[i][j];
        }
    }

    return ret;
}
タイトルとURLをコピーしました