`
ArrayNil
  • 浏览: 3500 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

在长度N的大数组里随机查出M个不重复元素的随机迭代器

 
阅读更多
经常用到,随机混排啥的场景,
从长度为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();
	}

}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics