| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3018 人关注过本帖
标题:[讨论]讨论一个小算法,希望能提高点效率
取消只看楼主 加入收藏
cobby
Rank: 1
等 级:新手上路
威 望:1
帖 子:565
专家分:0
注 册:2007-7-11
收藏
 问题点数:0 回复次数:7 
[讨论]讨论一个小算法,希望能提高点效率
有一个一维数组,值域为[0,10],如array[10]={0,0,0,2,5,0,0,4,3,0};
现在的要求是,控制数组的非0元素的数量,比如要求非0元素最多为2个,那么上面这个数组的非0元素个数4就超过了2个,于是要随机选择2个非0元素赋值为0。现在的问题是怎么样的算法能够用最短的时间内解决问题。

一个简单的办法是
modify_num=0; //被修改的元素个数,在上例中应该上限为2
while(modify_num<2)
{
pos=rand(10); //随机产生一个拟修改的元素位置
if(array[pos]!=0) //只有非0元素才需要修改
{
array[pos]=0;
modify_num++;
}
}

这种算法会无谓浪费很多由于随机指定的元素已经是0而不需要修改的时间,不知道有没有更好的办法。
搜索更多相关主题的帖子: 算法 效率 值域 元素 
2007-10-12 14:03
cobby
Rank: 1
等 级:新手上路
威 望:1
帖 子:565
专家分:0
注 册:2007-7-11
收藏
得分:0 
没人帮忙吗?自己顶下先!

努力成为菜鸟!
2007-10-12 20:19
cobby
Rank: 1
等 级:新手上路
威 望:1
帖 子:565
专家分:0
注 册:2007-7-11
收藏
得分:0 
谢谢关注,使用随机数是算法要求,因为我写的是非确定性搜索算法。程序需求没法改的,不然需要打破理论限制,现在希望在理论即定的前提下提高程序效率呵

努力成为菜鸟!
2007-10-12 22:22
cobby
Rank: 1
等 级:新手上路
威 望:1
帖 子:565
专家分:0
注 册:2007-7-11
收藏
得分:0 

楼上的方法看上去确实是可行的,谢谢了。这个问题我自己又从数学上推导了一下,和你讨论一下。
假设数组长度也就是元素总数为n,其中非0元素数量为m,额定最大非0元素数量为L,则消除多余非0元素的程序执行次数的数学期望为

图片附件: 游客没有浏览图片的权限,请 登录注册

如上例中,n=10,m=4,L=2,则执行次数的数学期望为5.8。我实验过,每1000次运行,平均执行次数在5.7-5.9之间跳动,说明公式正确。

楼上朋友的方法我也推导了一下,由非0元素组成的数组比原数组小许多,但某一非0元素被选后不可再选,因为随机选择的问题回到了上例的大数组中,但规模已经缩小,于是公式发生微小变化,为,上例数据中,它的数学期望为2.5。但是这个方法多了一步选择前的遍历原数组的操作,这部分时间将抵消5.8-2.5=3.3的时间。两种方法哪个好关键看3.3次执行和n长度数组的遍历时间哪个更长。

有意思,欢迎继续讨论。


图片附件: 游客没有浏览图片的权限,请 登录注册


努力成为菜鸟!
2007-10-13 09:50
cobby
Rank: 1
等 级:新手上路
威 望:1
帖 子:565
专家分:0
注 册:2007-7-11
收藏
得分:0 
以下是引用aipb2007在2007-10-13 10:38:12的发言:

非要做的话,用空间平衡时间是必要的。

上面的期望就不懂 了,不喜欢分析,

用空间平衡时间没问题呀,请给个方法了。现在对空间要求一般不高的


努力成为菜鸟!
2007-10-13 10:56
cobby
Rank: 1
等 级:新手上路
威 望:1
帖 子:565
专家分:0
注 册:2007-7-11
收藏
得分:0 
多谢楼上的讨论。你的改进方法比一开始那种方法减少了空间要求,不过时间复杂度和前者是一致的呵。正像我前面说的,你的方法和我的方法哪个优,就看我的3.3次循环和你的一次数组遍历的时间哪个更大了。


我又思考了一下,对于小规模问题,即数组元素较少的情况下,还是我的原始方法优;如果问题规模增大,那么你的方法比我的原始方法更优。

看来这个问题也只有这两种办法了,想不出其它的了。

努力成为菜鸟!
2007-10-14 14:43
cobby
Rank: 1
等 级:新手上路
威 望:1
帖 子:565
专家分:0
注 册:2007-7-11
收藏
得分:0 
谢谢讨论呵。刚刚完成PSO算法的TSP程序,现在回家啦。有机会再交流哦

努力成为菜鸟!
2007-10-14 16:17
cobby
Rank: 1
等 级:新手上路
威 望:1
帖 子:565
专家分:0
注 册:2007-7-11
收藏
得分:0 
如何定义?怎么操作?

努力成为菜鸟!
2007-10-18 19:26
快速回复:[讨论]讨论一个小算法,希望能提高点效率
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.037669 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved