javascript-创建最大连通图

时间:2014-12-16 19:10:05

标签: javascript jquery algorithm

我有以下输入,例如:

events = [
   { start: 30, end: 150},
   { start: 540, end: 600},
   { start: 560, end: 620},
   { start: 610, end: 670}
]

开始,结束意味着从上午9点开始的分钟或其他任何事情。

我想要这样的输出,

events = [
    [{ start: 30, end: 150}],
    [{ start: 540, end: 600}, {start: 560, end: 620}, {start: 610, end: 670}]
]

我有一个函数确定两个对象是否会及时发生碰撞。

var isOverLapping =  function(event1, event2){

        if (event1.end >= event2.start && event1.start <= event2.end) {
            return true;
        }
    return false;
};

例如,我在开头可以看到四个事件,比方说1,2,3,4。

由于2次与3次碰撞,3次与2次碰撞,4次碰撞3次。 所以他们应该属于一组[2,3,4],即[{ start: 540, end: 600}, {start: 560, end: 620}, {start: 610, end: 670}]

我知道可能会感到困惑。希望这会让我的想法更加清晰。想想与时间碰撞作为联系。如果A连接到B而B连接到C,那么A也连接到C,因此它们应该属于一个集合。

我需要帮助用JavaScript编写这个。有什么想法吗?我发布此帖时,我没有找到一个好方法。

感谢。

2 个答案:

答案 0 :(得分:2)

这应该有效:

events = [
   { start: 30, end: 150},
   { start: 540, end: 600},
   { start: 560, end: 620},
   { start: 610, end: 670}
]

var sets=[], max, arr=[];

events.sort(function(a,b){return a.start-b.start}) // sort by start time

if(events.length){
    max=events[0].end
    arr.push(events[0])
}

for(var i=1;i<events.length;i++){
    var event = events[i];
    if(event.start <= max){ // overlap (we already know that event.start >= the one before )
        arr.push(event) // push event
        max=Math.max(max, event.end) // update max
    }else{
        sets.push(arr.slice(0)); // push what we have till now
        arr=[]; // clear array
        max=event.end;  // update max
        arr.push(event) // push event
    } 
}
sets.push(arr.slice(0)); // push remaining
console.log(sets)

答案 1 :(得分:0)

如果至少有一个在范围内,则必须检查(开始和结束),然后对象属于第二个组。试试这个功能:

var isOverLapping =  function(event){

    // "calendar" on line below should ref the element on which fc has been called 
    for(var i = 0 ; i < events.length; i++) {
        if ((event.end >= events[i].start && event.end <= events[i].end)
            || (event.start >= events[i].start && event.start <= events[i].end)) {
            return true;
        }
    }
    return false;
};