【问题标题】:Implement poisson disk sampling in linear time在线性时间内实现泊松盘采样
【发布时间】:2017-06-04 22:55:08
【问题描述】:

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

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

【问题讨论】:

    标签: algorithm poisson


    【解决方案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);

    返回返回;

    【讨论】:

    • 如果我在元素被 push 时执行改组步骤然后从最后开始执行所有弹出操作,它是否仍然有效?
    • 我没有详细介绍,但我认为要证明每个元素总是具有与以前相同的随机选择概率会很复杂,因为如果你早点进行洗牌,你不知道以后还会放多少其他元素。
    猜你喜欢
    • 1970-01-01
    • 2019-11-16
    • 2012-07-19
    • 2021-08-11
    • 2022-08-04
    • 2015-07-21
    • 2016-10-22
    • 2012-07-09
    • 2016-02-29
    相关资源
    最近更新 更多