导航
  • 主页
  • 基础类
  • 应用实例
  • 新技术前沿

有一个算法困扰我了.不知道难不难,我是被绕住了。

xiaoku 2008-01-10 05:41:34

情况描述:
有一个表:如下
t
ID int 唯一记录标示
MediaID varchar(10) 媒体ID,
BusID int 站点ID,
Start datetime ,媒体使用开始时间
End datetime ,媒体使用结束时间

每个站点ID可以有几个媒体ID,每条记录的是的该媒体使用的时间段。
现在的问题是:

再某一个时间段内,媒体使用情况相对比较杂乱,想优化一下媒体的使用情况.
如:
ID MediaID BusID start end
1 'a' 1 '2008-01-01' '2008-01-15'
2 'b' 1 '2008-01-16' '2008-01-31'
3 'c' 1 '2008-02-01' '2008-02-29'
4 'a' 1 '2008-02-01' '2008-02-29'

以上记录可以看出在 '2008-01-01'到'2008-02-29'这个时间段内,
站点1,是可以被优化的,ID为2的记录,可以被优化成 MediaID 为'a'.
当然实际情况一个站点可以能有3个以上的媒体的。
我现在的情况是要处理多个媒体的情况下,我就不知道改如何处理这个优化记录了.

以下是测试数据
create table t
(
ID int identity(1,1) ,
MediaID varchar(10),
BusID int ,
start datetime ,
[end] datetime ,
status int , --记录是否被优化过
)
insert into t select 'a',1,'2007-12-01','2008-01-15',0
insert into t select 'a',1,'2008-02-16','2008-03-15',0
insert into t select 'a',1,'2008-05-01','2008-05-31',0
insert into t select 'b',1,'2008-01-16','2008-02-15',0
insert into t select 'b',1,'2008-04-01','2008-04-15',0
insert into t select 'c',1,'2007-12-16','2008-01-15',0
insert into t select 'c',1,'2008-03-16','2008-04-15',0
insert into t select 'd',1,'2008-01-01','2008-01-31',0
insert into t select 'd',1,'2008-03-01','2008-03-31',0
insert into t select 'e',1,'2008-01-01','2008-01-31',0
insert into t select 'f',1,'2008-02-16','2008-03-31',0
insert into t select 'g',1,'2008-05-01','2008-05-31',0
insert into t select 'h',1,'2008-02-01','2008-02-29',0
insert into t select 'i',1,'2008-04-01','2008-04-30',0
insert into t select 'j',1,'2008-02-01','2008-02-15',0

像以上记录:可以排列成
媒体 12月 12.5月 1月 1.5月 2月 2.5月 3月 3.5月 4月 4.5月 5月 5.5月 6月
a ———————————————————— —————————————— ——————————
b ———————————————— ————————
c —————————————— ——————————————
d —————————— ——————————
e ——————————
f —————————————————
g ————————————
h ————————————
i ——————————
j ——————
上图就是个媒体使用的时间段。

我现在被困扰的是在e媒体优化的时候可以选择f,g,h,i,j这个媒体。
可实际上这几个媒体都可以被安排到abcd中,所以e大致就不需要动了。

不知道我说明白了没有?脑袋乱了...
...全文
334 点赞 收藏 31
写回复
31 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
xiaoku 2008-03-04
呵呵...去年的贴子了.不过也不在那里做了.
那时候偶花费了一个星期来搞这个玩意.
用了排除法,最终也模糊得搞定了.写了好几百行的代码.
回复
wyb6458 2008-01-11
如果不能分解就可以理解成多线程调度问题,完成特定的任务需要的线程的最小值
回复
wyb6458 2008-01-11
不知道你那些时间段可不可以分割?
回复
cxmcxm 2008-01-11
重新安排媒体.
假设从时间a开始,对一个站点,多个媒体.先找出开始时间最接近a的记录,将其安排到其中的一个媒体,再将开始时间小于第一个结束时间的记录安排到其它媒体,
安排完后,可得出所有媒体的已安排过的结束时间,将其作为新起点,再从未安排的记录中查找开始时间最接近各新起点的记录,逐个选下去.重复以上步骤,直到排完
为止.
回复
hujian0606 2008-01-11
晕^^
回复
xiaoku 2008-01-11
而且,麻烦的一点是:

还得考虑记录的拆分.
回复
xiaoku 2008-01-11
谢谢版主.

现在感觉,不用游标都难了.
现在的思路先把最多记录的媒体给找出来,看谁合适就把谁塞进去.然后一个个循环...
回复
sdsxlj 2008-01-11
发表于:2008-01-10 18:35:2918楼 得分:0
看是看明白了,要用到递归,麻烦.帮顶.
---------
哈哈,乌龟不能怕麻烦呀,千万不要缩头跑了啊:)
回复
xiaoku 2008-01-11
不知道你那些时间段可不可以分割?

-----------------
to:wyb6458
分不分割是要看传进来的参数决定的.
你说的有点像的.
回复
gimse7en 2008-01-11
帮顶
回复
fa_ge 2008-01-11
野蛮兄,我帮你顶
回复
fulianglove 2008-01-11
挺难的,还是去召唤邹老大来吧
回复
xiaoku 2008-01-10
大乌龟不是吧...说说思路.
回复
dawugui 2008-01-10
看是看明白了,要用到递归,麻烦.帮顶.
回复
dobear_0922 2008-01-10
看看
回复
xiaoku 2008-01-10
这两天头脑一直是晕的....
回复
xiaoku 2008-01-10
其实我要的结果就是:
在某一时间段内,尽量把减少媒体的使用,如 1-6月中,
j 可以 替换成a ,
i 换成 d
...


如 1-6月中最终使用了
a,b,c,d,e
5个媒体.
其他媒体就被释放出来了.
回复
dawugui 2008-01-10
这个数据要跨年的,确实麻烦.
回复
xiaoku 2008-01-10
媒体 12月 12.5月 1月 1.5月 2月 2.5月 3月 3.5月 4月 4.5月 5月 5.5月 6月
a ———————————————————— —————————————— ——————————
b ———————————————— ————————
c —————————————— ——————————————
d —————————— ——————————
e ——————————
f —————————————————
g ————————————
h ————————————
i ——————————
j ——————
上图就是个媒体使用的时间段。
不知道是什么意思??

最主要的是我不清楚你要干什么?


----------------
谢谢:关注.

其实我画这个图的意思是:能够让大家很直观的明白我那些测试数据,媒体所占用的时间.
回复
xiaoku 2008-01-10
hehe... 龟,这个带点的是表示半个月的说法.

刚刚csdn打不开.

优化:
就是指 同一个站点的媒体,可以重新编排一下,来达到使用最少的媒体,来做到相同的目的。

如测试记录里面的在1月-6月的时间段内,
g媒体,可以替换成b媒体,以达到b的最大利用率.
同事g媒体被释放出来。
回复
发动态
发帖子
MS-SQL Server
创建于2007-09-28

3.2w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
社区公告
暂无公告