随机放置非重叠间隔

时间:2015-11-20 16:24:59

标签: algorithm random intervals

我有一个区间 G ,以及一组不同长度的非重叠子区间 s 1 ,s 2 ,...,s n

G |--------------------------------------------------------------// //-----------|
        s1 [---]                       s3 [------------------]
                    s2 [------]                                         sn [--]     

我正在寻找一种算法来获取所有这些子间隔,然后将它们再次放在 G 上,这样它们就不会重叠。这样做的最佳方式是什么?

最简单,最天真的方法是简单地随机选择每个子区间的起始位置,一旦放置所有区间就检查重叠,然后如果存在重叠则重新开始。如果子间隔提供 G 的稀疏覆盖,这可能会非常快,但随着密度的增加,效率会越来越低。

类似的想法是在放置每个子间隔时检查重叠。但是对效率的担忧也是如此。

有没有更聪明的方法来处理这个?

更新

澄清几点:

  • 我希望随机分布的子区间距。
  • 在这种情况下,均匀分布可能是最合适的随机概念。
  • 这些是离散的(整数)闭合间隔,而不是连续的。

2 个答案:

答案 0 :(得分:8)

我认为奥克奥的回答会给出差距的偏差分布(即第一个差距往往会比后来的差距更大。

但是,我认为一种非常相似的方法应该会更好:

  1. 将所有sn缩小为零长度
  2. 为lenG-lenS
  3. 中的每个sn选择随机位置
  4. 将sn扩展回原来的长度

答案 1 :(得分:3)

这样的东西?

{
    "result" : [ 
        {
            "_id" : ObjectId("564f487c7d3c273d063cd21e"),
            "matched" : true
        }, 
        {
            "_id" : ObjectId("564f487c7d3c273d063cd21f"),
            "matched" : true
        }, 
        {
            "_id" : ObjectId("564f487c7d3c273d063cd220"),
            "matched" : false
        }, 
        {
            "_id" : ObjectId("564f487c7d3c273d063cd221"),
            "matched" : false
        }
    ],
    "ok" : 1
}