Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 查找连续时间段的最大集合_Php_Algorithm - Fatal编程技术网

Php 查找连续时间段的最大集合

Php 查找连续时间段的最大集合,php,algorithm,Php,Algorithm,我有一个给定日期的时间段数组,其中有些重叠,如(开始、结束): 我想找出连续时间段的最大集合。在上面的示例中,有3组连续时间(如下所示),但由于第一组是第二组的较小“备选方案”,因此应忽略它,因此我们只剩下2和3 11.00-11.30、11.30-11.45、11.45-12.00 11.00-11.30、11.30-11.45、11.45-12.15、12.15-12.45 14.15-14.35、14.35-14.40 我必须补充一点:我希望能够指定一个定义连续含义的“容差”。在上述示例中

我有一个给定日期的时间段数组,其中有些重叠,如(开始、结束):

我想找出连续时间段的最大集合。在上面的示例中,有3组连续时间(如下所示),但由于第一组是第二组的较小“备选方案”,因此应忽略它,因此我们只剩下2和3

  • 11.00-11.30、11.30-11.45、11.45-12.00
  • 11.00-11.30、11.30-11.45、11.45-12.15、12.15-12.45
  • 14.15-14.35、14.35-14.40
  • 我必须补充一点:我希望能够指定一个定义连续含义的“容差”。在上述示例中,连续表示第一个时间段的结束时间==下一个时间段的开始时间,但最好将连续定义为“相隔5分钟”的时间段

    任何关于如何在php或伪代码中实现这一点的想法都将不胜感激

    这感觉像是一种问题。我想它也可以作为一个图形问题来解决

    如果将数据转换为图形:每个周期都是一个顶点,如果两个顶点是连续的,则两个顶点是连接的(使用您希望的任何公差级别)。所有边都具有相同的权重。现在你需要在这个图上找到

    最长路径问题是一个NP完全问题,这是一个令人沮丧的问题。然而,对于没有圈的图,可以在多项式时间内解决这个问题。酷。我希望你的图表是a循环的(你不会整天都在转圈,对吧?)。所以,只要在每条边上加一个-1的权重,就可以找到最短的图。我提供的最后一个链接对此也有一个动态规划方法。

    这个问题有一个简单的解决方案。首先按开始日期升序排列时间段,如果相等,则按结束日期降序排列时间段。现在循环时间段并跟踪当前集合(它是最左侧和最右侧的位置)。这里是伪代码(或者一些PHP/C++ + JS混合)-< /P>
    bool comp(A,B){
    如果(A.start==B.start)返回A.end>B.end;
    返回A.startcurRight+TOLERANCE){//start新集合
    curLeft=periods[i]。开始,curRight=periods[i]。结束;
    }
    else{//展开当前集合
    curRight=max(curRight,句点[i].end);
    } 
    最长周期=最大值(最长周期,电流-卷曲);
    }
    回归期最长;
    }
    
    这些时间是否总是在同一天按顺序排列,或者是在不同的顺序和跨天排列?是的,它们都在同一天。对于像13.30-13.40和13.30-13.45这样的时间段,我猜“有序”意味着最小的优先?不管怎样,把它们按某种顺序排列都不难:)这真的很有帮助,谢谢。我已经实现了您提供的最后一个链接上给出的算法,但我无法调整它以获得实际路径。它说我必须引入“前置数组”,但我不确定它们的意思是什么?
    (10.00, 10.15) (11.00, 11.30) (11.30, 11.45) (11.45, 12.00) 
    (11.45, 12.15) (12.15, 12.45) (13.20, 13.30) (14.15, 14.35) (14.35, 14.40)
    
    bool comp(A, B) {
        if(A.start == B.start) return A.end > B.end;
        return A.start < B.start;
    }
    
    function getLongestSet( periods ) { //convert the times to integer first, period is pair of integers
        sort ( periods, comp);
        longestPeriod = 0;
        for(i = 0; i < periods.length; i++) {
            if(periods[i].start > curRight + TOLERANCE) { //start new set
                curLeft = periods[i].start, curRight = periods[i].end;
            }
            else { //expand current set
                curRight = max(curRight, periods[i].end);
            } 
            longestPeriod = max(longestPeriod, curRight - curLeft);
        }
        return longestPeriod;
    }