在线性时间内实施泊松盘采样

时间:2017-06-04 22:55:08

标签: algorithm poisson

我正在尝试实现噪声生成器(Poisson磁盘噪声)演示here并描述here,但我不知道如何让它在线性时间运行,因为要求从活动的样本队列中弹出随机活动样本(示例中的红点)。据我所知,这一步本身具有线性复杂性,因为样本不是从末尾弹出或从队列的开头出队,使得整个算法是二次的。

如何使噪音发生器在时间上真正线性?据我所知,这需要一个序列,可以在一个恒定的时间内删除随机元素。

1 个答案:

答案 0 :(得分:1)

据我所知,您需要在此队列上执行的唯一操作是选择和删除随机元素,以及添加新元素。特别是,您不需要保留订单。

为了实现这一点,我将使用一个支持可变长度数组的类,例如std :: vector或java.util.ArrayList。要添加元素,只需使用push_back()或add()在末尾添加一个元素。要删除随机元素,请在数组中选择一个随机元素,保存它,将数组末尾的元素复制到刚刚保存的元素上,然后将数组的大小减小一个。像

这样的东西

index = rng.nex()tInt(arr.size());

toReturn = arr.get(index);

arr.set(index,arr.get(arr.size() - 1));

arr.resize(arr.size() - 1);

返回返回;