从长度为N(很大)的数组里找到M(较小)个不重复元素下标的随机迭代器
空间复杂度 M
时间复杂度 Mlog(M)
神马100挑10个、100挑99个、10000000挑100、10挑10之类M比较小的场景都是性能稳定的,没有随机碰撞的情况,比较适合广大重度强迫症患者;
import java.util.HashMap; import java.util.Iterator; import java.util.Random; /** * @author fudi * @since 2013-10-30 */ public class RandomIndexIterator implements Iterator<Integer> { private int index; private int limit; private HashMap<Integer, Integer> map; private int poolSize; private Random random; public RandomIndexIterator(int poolSize, int limit) { this(poolSize, limit, new Random()); } public RandomIndexIterator(int poolSize, int limit, long seed) { this(poolSize, limit, new Random(seed)); } public RandomIndexIterator(int poolSize, int limit, Random random) { this.random = random; this.limit = limit; this.poolSize = poolSize; this.map = new HashMap<Integer, Integer>(limit << 1); } @Override public boolean hasNext() { return index < limit; } @Override public Integer next() { if (index >= limit) { return null; } int rIndex = this.random.nextInt(poolSize - index) + index; Integer current = map.get(index); if (current == null) { current = index; } Integer previous = map.get(rIndex); if (previous == null) { previous = rIndex; } map.put(rIndex, current); map.put(index, previous); ++index; return previous; } @Override public void remove() { throw new UnsupportedOperationException(); } }