在java中置换数组中的大型元素列表

时间:2014-05-12 15:48:57

标签: java arrays algorithm random permutation

你好我有1000个元素的列表,有重复项,如果我想在删除重复项之后得到它们的所有排列,那么这样做的最佳和最有效的方法是什么。

Random rand = new Random();
for (int i = 0 ; i < 1000 ; i ++) {
        list.add(i,rand.nextInt(500));
}

上面我们得到一个1000个元素的数组,也会有重复的元素。打印排列的更好方法是什么,以便占用更少的内存空间和更少的时间。

我使用了递归置换算法,但n> 1的值需要时间。 15并且在一个点之后抛出异常堆内存溢出

这会更好,http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

3 个答案:

答案 0 :(得分:0)

java.util.Set类会自动清除重复项。

Set set = new HashSet<>(); Random rand = new Random(); for (int i = 0 ; i < 5000 ; i ++) { set.add(i,rand.nextInt(100)); }

答案 1 :(得分:0)

首先,生成所有排列需要时间。置换你的5000个元素所需的时间比我们宇宙的估计年龄要花费更多的时间。

其次,存储所有排列是低效的。相反,您希望动态生成排列。请看一下这段代码:http://cs.fit.edu/~ryan/java/programs/combinations/Permute-java.html

答案 2 :(得分:0)

Inplace permutation。首先对数组进行排序,然后找到数组中的所有permutaitons。在每次迭代时,它也会更改数组。

import java.util.Arrays;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;

import org.apache.commons.lang3.ArrayUtils;

public class Permutate {

    public static void main(String[] args) {
        Permutate permutator = new Permutate();
        Set<Integer> data = new HashSet<Integer>();
        Random r = new Random();
        for (int i = 0 ; i < 5000 ; i ++) {
        data.add(r.nextInt(100));
        }
        int[] array = ArrayUtils.toPrimitive(data.toArray(new Integer[data.size()]));
        Arrays.sort(array);
        do{
            System.out.println(Arrays.toString(array));
        } while(permutator.permutate(array) != -1);
    }

    public int permutate(int[] array) {
        int i, j;

        for (i = array.length - 2; i >= 0; i--) {
            if (array[i] < array[i + 1])
                break;
        }
        if (i < 0) {
            return -1;
        }

        for (j = array.length - 1; j > i; j--) {
            if (array[j] > array[i])
                break;
        }

        swap(array, i++, j);

        for (j = array.length - 1; j > i; i++, j--) {
            swap(array, i, j);
        }
        return 0;
    }

    public void swap(int[] array, int x, int y) {
        array[x] ^= array[y];
        array[y] ^= array[x];
        array[x] ^= array[y];
    }
}