例如,生成{4,3,1,5,2}或者{3,1,4,2,5}是合法置换,但{5,4,1,2,1}却不是,因为1重复出现而3未出现
前提:假设存在一个随机数生成器RandInt(i, j),它以相同的概率生成i 和 j之间的一个整数
O(N) 算法
① 为该数组赋值使得A[i] = i + 1
②
for (int i = 1; i < N; i ++)
swap(&A[i], &A[RandInt(0, i)]);
若使用循环来判断重复,则时间复杂度是O(N^2logN)
若使用标记数组book[N],则时间复杂度是 O(NlogN)
顺带一提,在后面两个算法中,RandInt生成一个不重复数字的数学期望是 N/(N-i)。 因为生成一个与前i个数不同的数字的概率是 (N-i)/N,所以平均进行N/(N-i)次尝试才能生成一个不重复数字