你好我有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
答案 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];
}
}