不重复排列列表的问题,详见内文,谁能完美解决,现金感谢100元

coolyhtao 2010-09-24 11:58:55
现在要实现这么个功能,有4个视频节目A,B,C,D一段时间内A要播放120次,B 80次,C 300次,D400次。要求排出他们的播放序列,序列要符合两个要求:1.同一个节目不能连续播放,必须有间隔。2、播放次数的多出现的频率高。例如上面提到的总共播放次数是900次,那么各个视频的播放次数不能少,并且不能重复连续播放,要生成一个混合列表
现在我的做法是,先做一个10维数组,其中有1个A,2个B,3个C,4个D,然后随机取这个十维数组的某一位,放入队列,然后随机去第二位,如果与第一个不重复就放入序列,如果重复就重取,这样就能实现要求的功能。
但是现在的问题是:如果播放次数不是100的整数,而是像110,120,150这样的数,就只能从大小为11+12+15这样较大的数组取数,由于随机数回渠道重复的数组,而这个数组有很大,所以造成效率很低,重复取到相同节目的情况很多,程序很久没有响应。

上文为了是问题简化所以说是4个视频,并注明了播放次数,实际问题是视屏数量个能多大几十个,每个的播放次数都是10的整数倍。
那位大侠能帮小弟出出主意,需要的话我把我的例子发出来,VB写的,如果能帮我解决问题,人民币感谢100元,决不食言。谢谢
...全文
198 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
pmars 2010-09-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 locket 的回复:]
给你一个算法:
1,先分配好每个节目出现的频率,比如D400次,则为4/9
2,先取频率大的那个播放,重新计算频率
3,后续的播放规则是从队列中找频率大并且和前一个不重复的那个开始播放,重新计算频率
[/Quote]
这个问题这样就解决了!
呵呵,楼主可以给他钱了!给税交给我吧,哈!
bigzoom 2010-09-26
  • 打赏
  • 举报
回复
提供一个思路,应该可以实现:
1.找出几个数的最小公倍数
2.按照各个数占最小公倍数的比率计算间隔的频率
coolyhtao 2010-09-25
  • 打赏
  • 举报
回复
难道没有大侠晓得怎么解决吗?奖金加到200元,我电邮coolyhtao@qq.com
liuping00 2010-09-25
  • 打赏
  • 举报
回复
我觉得楼主自已的办法是不错的,主要问题在于重复取数的概率太大
所以现在主要想办法解决这个问题,我帮你想了一个办法解决这个问题,以解决重复取数的问题
根据我在纸上演算是可行的
在你原有的基础上增加处理,大概的思路就是,根据每次取得的节目对应的播放次数来改变取随机数的范围(最大值为所有节目播放次数的总和减上次取得的节目的播放次数),
再看下次取的随机数是否大于上次取的节目前面的节目的所有播放次数的总和,不大于就直接比较,如果大于就用随机数加上次取得节目的次数的和去比较,这样就只要增加小的加减算计与比较,就可以解决重复取数的问题

不知楼主是否看得明白,本人表达能力不强
locket 2010-09-25
  • 打赏
  • 举报
回复
给你一个算法:
1,先分配好每个节目出现的频率,比如D400次,则为4/9
2,先取频率大的那个播放,重新计算频率
3,后续的播放规则是从队列中找频率大并且和前一个不重复的那个开始播放,重新计算频率
scientictree 2010-09-25
  • 打赏
  • 举报
回复
要不重复连续出现,算法很简单。

把视频按由小到大排序 ,更多的也都可以这样做的
如果某个视频数量超过总一半,根据抽屉原理,此题无解,可以直接退出

排序后
视频video {B, A, C, D}
个数num {b, a, c, d }
比前面多remain {b, a-b,c-a,d-c}

在B用尽前,就是不断的BACD循环,B用尽后,ACD循环,接着是CD循环。
得到的队列是

b*(BACD) + (a-b)*(ACD) + (c-a)(CD) + (d-c)D

最后多出来的(d-c)个D,先优先插入BA之间,BA插完插AC中间即可。

不需要实际做数组移动,用数学直接算结果能更省时间

这样出来的结果不是很好看,B都集中到了前部,如果要结果均匀,需要隔组中心对称对调
hao446tian 2010-09-25
  • 打赏
  • 举报
回复
你这里主要是解决两个问题,主要是考虑效率
1.同一个节目不能连续播放,必须有间隔。//这个比较好解决
2、播放次数的多出现的频率高。
我有一个办法是:你可以定义一个字符串"ABCD",初始时你视屏数量有多少这个字符串的长度就是多少,可以根据这个字符串的索引index来随机取数,如现在长度是4,就在0-4之间随机取一个数,当点播其中一个时,假设为A,修改这个字条串为"ABCDA",依次累推,如果这个字符串会很长,你可以考虑用另一个字符串来做索引,原理相关于oracle的分区

590

社区成员

发帖
与我相关
我的任务
社区描述
提出问题
其他 技术论坛(原bbs)
社区管理员
  • community_281
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧