二分算法

[quote="a_lion"][quote="卒子99"][quote="黑暗浪子"]1到50共有五十个数字,随即去掉一个数字,剩下49个放在一个数据集合中(可能是数组,可能是list,更有可能是set)
写一段代码,把那个去掉的数字找出来。
要求:效率最高,查找速度最快。
上海sungard公司出的
[/quote]
这个些数字放到集合中有什么要求?如果是有序放到集合中,我会使用折半查找的思想来做,必如先找到index = 24的数字,判断是小于25,还是等于25。
如果小于25则在前25个数字中,等于25则在后25个数字中找


如果是无序放上的,也不知道有什么好方法了,先排一次序?还是依次比较

呵呵,还请指教正确解答[/quote]

对新数据集合里的元素求和,然后用原来的和减去这个数就得到结果了。[/quote]

事实上,还是二分法比较快,请看我的实验代码,大家有兴趣的话可以跑跑看.
public static void main(String[] args) {		 
int[] all = new int[10000];
int[] sub = new int[9999];

for(int i=0,j=0; i<10000; i++){
all[i] = i+1;
if(i != 30){
sub[j] = i+1;
j++;
}
}

Date begin_1 = new Date();
int sum_all = 0;
int sum_sub = 0;
for(int i=0; i<sub.length; i++){
sum_all += all[i];
sum_sub += sub[i];
}
sum_all += all[all.length-1];
System.out.println("number is: " + (sum_all-sum_sub) + " all time is: " + (new Date().getTime()-begin_1.getTime()));

Date begin_2 = new Date();
int number = 0;
int a_all = 0;
int a_sub = 0;
int low = 0;
int high = sub.length-1;
for(int i=sub.length/2;;){
if(sub[i] == all[i]){
low = i;
i = (i + high)/2;
if((high-low) <= 1){
number = all[i+1];
break;
}
}else{
high = i;
i = (i + low)/2;
if((high-low) <= 1){
number = all[i+1];
break;
}
}
}
System.out.println("number is: " + number + " all time is: " + (new Date().getTime()-begin_2.getTime()));
}

是要看所求项数(n)大小
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值