【发布时间】:2017-06-04 22:55:08
【问题描述】:
我正在尝试实现噪声生成器(泊松盘噪声),演示了here 并描述了here,但由于 的要求,我不知道如何使其在线性时间内运行从活动样本队列中弹出随机活动样本(示例中的红点)。据我所知,这一步本身具有线性复杂性,因为样本不是从队列的末尾弹出或从队列的开头出列,使得整个算法是二次的。
如何使噪声发生器在时间上真正线性化?据我所知,这需要一个可以在恒定时间内移除随机元素的序列。
【问题讨论】:
我正在尝试实现噪声生成器(泊松盘噪声),演示了here 并描述了here,但由于 的要求,我不知道如何使其在线性时间内运行从活动样本队列中弹出随机活动样本(示例中的红点)。据我所知,这一步本身具有线性复杂性,因为样本不是从队列的末尾弹出或从队列的开头出列,使得整个算法是二次的。
如何使噪声发生器在时间上真正线性化?据我所知,这需要一个可以在恒定时间内移除随机元素的序列。
【问题讨论】:
据我所知,您需要在此队列上执行的唯一操作是选择和删除随机元素以及添加新元素。特别是,您不需要保持秩序。
为了实现这一点,我将使用一个支持可变长度数组的类,例如 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);
返回返回;
【讨论】: