| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3018 人关注过本帖
标题:[讨论]讨论一个小算法,希望能提高点效率
只看楼主 加入收藏
柒兲
Rank: 1
等 级:新手上路
威 望:1
帖 子:126
专家分:0
注 册:2007-9-26
收藏
得分:0 

看不懂`!~顶`!太深了`1`哈哈

2007-10-14 13:39
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 

是我说的不清楚吧.
假设一数组是a[10]={0,1,0,0,2,0,0,3,0,4};
如果直接用随机的话,第一次取道非0数是4/10,第二次是3/10...概率相对来说很小.
但另外用个数组来保存这些非0数.
b[4]={1,4,7,9}//分别记录非0元素原来的位置
但如果是这样,则概率是1 3/4...
同时可以根据随机到的位置去找原数组是否为非0,并且可以修改原数组元素为0,而这个表不用修改.
假设我随机到 3 (rand()%4),对应的是b[3]即a[b[3]]=a[7],判断并修改a[7]=0.

不知道说清楚没

倚天照海花无数,流水高山心自知。
2007-10-14 13:46
cobby
Rank: 1
等 级:新手上路
威 望:1
帖 子:565
专家分:0
注 册:2007-7-11
收藏
得分:0 
多谢楼上的讨论。你的改进方法比一开始那种方法减少了空间要求,不过时间复杂度和前者是一致的呵。正像我前面说的,你的方法和我的方法哪个优,就看我的3.3次循环和你的一次数组遍历的时间哪个更大了。


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

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

努力成为菜鸟!
2007-10-14 14:43
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
我们要避免存在的死循环危机.
你自己测试一下吧.呵呵.

倚天照海花无数,流水高山心自知。
2007-10-14 15:06
cobby
Rank: 1
等 级:新手上路
威 望:1
帖 子:565
专家分:0
注 册:2007-7-11
收藏
得分:0 
谢谢讨论呵。刚刚完成PSO算法的TSP程序,现在回家啦。有机会再交流哦

努力成为菜鸟!
2007-10-14 16:17
myfuture
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2007-8-17
收藏
得分:0 
用三元组的形式不知道能不能做哦,你试下哈

never give up.....And hope in future...
2007-10-18 18:59
cobby
Rank: 1
等 级:新手上路
威 望:1
帖 子:565
专家分:0
注 册:2007-7-11
收藏
得分:0 
如何定义?怎么操作?

努力成为菜鸟!
2007-10-18 19:26
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 

三元组麻烦,而且估计效率也不会很高.


倚天照海花无数,流水高山心自知。
2007-10-26 20:15
柒兲
Rank: 1
等 级:新手上路
威 望:1
帖 子:126
专家分:0
注 册:2007-9-26
收藏
得分:0 
用三元组`
我想不到最好的方法了!

2007-10-27 22:35
leeco
Rank: 4
等 级:贵宾
威 望:10
帖 子:1029
专家分:177
注 册:2007-5-10
收藏
得分:0 


#include <iostream>
#include <algorithm>
using namespace std;

const int MAXN=10;
int array[MAXN]={0,0,0,2,5,0,0,4,3,0},n=10;
int cur[MAXN],cur_size;

int main()
{
cur_size=0;
for(int i=0;i<n;i++){
if(array[i]){
cur[cur_size++]=i;
}
}
if(cur_size>2){
srand(time(0));
random_shuffle(cur,cur+cur_size);
}
for(int i=0;i<cur_size-2;i++){
array[cur[i]]=0;
}
for(int i=0;i<n;i++){
printf(\"%d \",array[i]);
}
printf(\"\n\");
scanf(\"%*s\");
}

2007-10-28 01:53
快速回复:[讨论]讨论一个小算法,希望能提高点效率
数据加载中...
 
   



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

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