【问题标题】:Consolidating overlapping sets from an array of sets合并一组集合中的重叠集合
【发布时间】:2011-04-13 13:01:08
【问题描述】:

我有一个数组,其中每个条目都包含一组集合的最小值和最大值,如下所示:

Array
(

    [0] => Array
        (
            [0] => 1200
            [1] => 2400
        )

    [1] => Array
        (
            [0] => 1400
            [1] => 3800
        )

    [2] => Array
        (
            [0] => 2700
            [1] => 4200
        )
    [3] => Array
        (
            [0] => 5900
            [1] => 6400
        )

)

对于每个索引,0 索引是最小值,1 索引是该特定集合的最大值。我需要创建一个 javascript 或 php 函数来合并这个数组,以便将重叠的集合变成一个。所以,上面的数组会变成下面这样:

Array
(

    [0] => Array
        (
            [0] => 1200
            [1] => 4200
        )
    [1] => Array
        (
            [0] => 5900
            [1] => 6400
        )

)

如您所见,从第一个数组开始,索引 0、1 和 2 被合并到第二个数组的索引 0 中。第一个数组中的索引 3 没有与任何其他集合重叠,因此成为第二个数组中的索引 1。

原始数组本身将包含大约 70 到 80 个集合,最小值和最大值可以高达 9999999999,因此以 n+1、n+2 方式遍历数轴是不可行的。

有什么想法吗?

更新 + 解决方案

正如下面评论中所说,这确实是一个转发(没有看到其他帖子)。解决方案的链接在以下链接:

Merging overlapping ranges in PHP arrays?

【问题讨论】:

  • 是否会像您的示例那样按下限对集合进行排序?
  • 抱歉回复晚了,赶上了一些项目。确实,它看起来确实像一个转贴……我在找它的时候没有看到那个帖子:/谢谢你。也感谢安德鲁·库珀。

标签: php javascript arrays


【解决方案1】:

假设集合按下限排序,如示例所示,这样的事情怎么样?

var newIndex = 0;
var newSetArray[newIndex][0] = setArray[0][0];
for (i = 1; i < setArray.length; i++) {
    if (setArray[i-1][1] < setArray[i][0]) {
        newSetArray[newIndex][1] = setArray[i-1][1];
        newSetArray[++newIndex][0] = setArray[i][0];
    }
}
newSetArray[newIndex][1] = setArray[setArray.length-1][1];

语法可能需要一些调整,但我认为这应该可行。

【讨论】:

    猜你喜欢
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 2018-07-17
    • 2021-03-29
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    相关资源
    最近更新 更多