首页 新闻 搜索 专区 学院

求算法(合并重叠时间段)

0
悬赏园豆:50 [已解决问题] 解决于 2011-03-02 19:55

同一天中的一连串不连续时间段,合并其中重叠时间,如:
StartTime EndTime
06:10:58 08:15:28
07:38:56 10:34:45
10:55:00 11:34:00
13:09:34 17:45:23
14:23:12 15:24:14
16:14:25 17:52:15
...
合并后为:
StartTime EndTime
06:10:58 10:34:45
10:55:00 11:34:00
13:09:34 17:52:15
...
时间复杂度尽量避免n^2的情况,即集合内任一元素与其他元素各比较一次

张磊 Larry.Zhang的主页 张磊 Larry.Zhang | 初学一级 | 园豆:105
提问于:2011-02-26 18:01
< >
分享
最佳答案
0

你是问SQL语句还是C#代码,你上面的那些数据放在哪儿?

参考:

public class bw22617
{
private List<Betime> timeList = new List<Betime>() {
new Betime{BeginTime=new DateTime(2011,3,1,6,10,58),EndTime=new DateTime(2011,3,1,8,15,28)},
new Betime{BeginTime=new DateTime(2011,3,1,7,38,56),EndTime=new DateTime(2011,3,1,10,34,45)},
new Betime{BeginTime=new DateTime(2011,3,1,10,55,0),EndTime=new DateTime(2011,3,1,11,34,0)},
new Betime{BeginTime=new DateTime(2011,3,1,13,9,34),EndTime=new DateTime(2011,3,1,17,45,23)},
new Betime{BeginTime=new DateTime(2011,3,1,14,23,12),EndTime=new DateTime(2011,3,1,15,24,14)},
new Betime{BeginTime=new DateTime(2011,3,1,16,14,25),EndTime=new DateTime(2011,3,1,17,52,15)}
};

public void Union()
{
for (int i = 0; i < timeList.Count-1;i++ )
{
int j=i+1;
if (timeList[i].EndTime >= timeList[j].BeginTime)
{
if (timeList[i].EndTime >= timeList[j].EndTime)
{
timeList[j]
= timeList[i];
}
else
{
timeList[j].BeginTime
= timeList[i].BeginTime;
}
timeList[i]
= null;
}
else
{
i
++;
}
}

timeList.ForEach(
delegate(Betime p)
{
if (p != null)
{
Console.WriteLine(
"BeginTime: "+p.BeginTime+"\tEndTime: "+p.EndTime);
}
}
);
}
}
public class Betime
{
public DateTime BeginTime { get; set; }
public DateTime EndTime { get; set; }
}

 

结果:

 

收获园豆:40
artwl | 专家六级 |园豆:16536 | 2011-02-27 11:39
用SQL或C#代码都可以,SQL的话因为数据库是SQL Compact,不支持存储过程,所以用C#相对简单一点,数据放在DataTable或List中都可以,其实任意语言均可,我只是想要一个好点的算法,我现在想出的算法是先排序,排序后遍历所有元素,两两比较,合并重叠,然后递归再次比较,直到每个元素都与它下一个元素没有重叠为止,这个算法一是效率太低,而且我觉得也有点问题
张磊 Larry.Zhang | 园豆:105 (初学一级) | 2011-02-27 22:35
我试了一下,可以用一次循环实现你的需求,不过你问题中自己给出的答案好像是错的哦,合并后应该有四条记录的
artwl | 园豆:16536 (专家六级) | 2011-03-01 14:59
其他回答(1)
0

虽然功能实现得还是不错的,不过个人感觉欠考虑,不是效率问题,而是准确度问题。比方说,后面一行记录的结束时间如果也小于前面一行记录,那么结束时间就不应该继续拿后面一行记录了。如果List内的数据未经过排序,那么这样做肯定得不到想要的结果。鉴于数据一般优先加载到DataTable中,在DataTable中使用筛选更加好。

收获园豆:10
秦楼东 | 园豆:913 (小虾三级) | 2011-03-02 11:06
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册