当当网一道笔试题,求帮助

意识模糊 2011-11-15 09:41:09
昨晚的笔试题:
大概是这个意思:一个数组X[1,2,....NUM]里面存放NUM个随机数,现在要找出数组里面的最大数和最小数,有min和max两个变量保存结果
一个种思路:遍历数组,把每个元素和关键字比较,每次都要把元素和min和max比较
第二种思路:如果一个数比min小就不可能比max大,不用再和max比较,如果比max大则不会比min小,不再和min比较




题目是给代码的,大概意思就这样,问的是第二种代码比第一种代码平均减少了多少次比较,写出推导过程

晚上要去面试,估计会问这道题目(我没做!),求答案和推导过程(我觉得能平均减少NUM/2次数)
...全文
4444 135 打赏 收藏 转发到动态 举报
写回复
用AI写文章
135 条回复
切换为时间正序
请发表友善的回复…
发表回复
636f6c696e 2012-01-15
  • 打赏
  • 举报
回复
bs你的是知道答案还不分享,csdn分有毛用啊
意识模糊 2012-01-12
  • 打赏
  • 举报
回复
楼太高,点分有点类,各位多包涵包涵!
相信不会太在意这点分数
636f6c696e 2012-01-11
  • 打赏
  • 举报
回复
bs楼主,不解释
gmemai 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 starfd 的回复:]
第一种不管怎么样都是要比较 2*Num次
第二种就是第一种的优化
最少比较Num次,最多比较2*Num次
平均不知道怎么算啊
难道是(Num + 2*Num )/2??
[/Quote]
我的思路:
既然是算时间的复杂度,那么每个数出现的频率就是一样的
1.2(NUM-1)//第一个直接赋值给max和min
2.((NUM-1)+2(NUM-1))/2
两式相减得出:1.5(NUM-1)
#朱守成# 2011-11-18
  • 打赏
  • 举报
回复
楼上的。。。。。。。。。。。。。
你们第一种算法都算错了,还怎么算第二种啊?
第一种:1+(num-2)*2次
解:
首先任意拿两个数出来比较大小分出一个min和一个max,这是第一次,然后再拿剩下的(num-2)个数分别和min和max比较也就是(num-2)*2次,所以总共要比较 1+(num-2)*2次。。。。。。。
creso 2011-11-18
  • 打赏
  • 举报
回复
1到100最好的情况min=1,max=100
最坏的情况min=99,max=100..最后一个比较的数是1
lg_asus 2011-11-17
  • 打赏
  • 举报
回复
下面我写的这个程序哪里有错,测试结果显示两种方法相差不多,和期望值n/2很大差距~
"java"
public class Test4 {
private static Random ran;
private int[] source;
private int min = 0;
private int max = 0;
private int compareCount = 0;

static{
ran = new Random();
}
public static void main(String...args){
Test4 t = new Test4();
t.init();
// t.printRan();
t.findMinMax(0);//2000
t.print();
t.findMinMax(1);//199X
t.print();
}
private void printRan() {
for(int i : source){
System.out.println(i);
}
}
private void init(){
//here I give 1000 numbers to test
source = new int[1000];
for(int i=0;i<source.length;i++){
source[i] = this.geneInt();
}

}
private int geneInt(){
return ran.nextInt();
}

private void print(){
System.out.println("Min:"+this.min);
System.out.println("Max:"+this.max);
System.out.println("compareCount:"+this.compareCount);
}
private int getBig(int a,int b){
this.compareCount++;
return a>b?a:b;
}
private int getSmall(int a, int b){
this.compareCount++;
return a<b ?a:b;
}
/**
* @param mode 0 means if a is large than max, no need to compare with min, so vice versa
*/
private void findMinMax(int mode){
this.min = source[0];
this.max = source[0];
this.compareCount = 0;

if(mode==0){
for(int a: source){
this.max = this.getBig(a, this.max);
this.min = this.getSmall(a, this.min);
}
}
if(mode==1){
for(int a: source){
if(this.max<this.getBig(a, this.max)){
this.max = a;
}else if(this.min>this.getSmall(a, this.min)){
this.min = a;
}
}
}
}
}
蓝波比基尼 2011-11-17
  • 打赏
  • 举报
回复
本来以为很简单,越往下看,越晕
殷小强 2011-11-17
  • 打赏
  • 举报
回复
[Quote=引用 105 楼 yxq371711105 的回复:]
第一种:NUM*2
第二种:NUM<= X <=NUM*2
[/Quote]
第一种:(NUM-1)*2
第二种:(NUM-1)<= X <=(NUM-1)*2
殷小强 2011-11-17
  • 打赏
  • 举报
回复
第一种:NUM*2
第二种:NUM<= X <=NUM*2
shadow_left 2011-11-17
  • 打赏
  • 举报
回复
答案是 1+1/2 + 1/3 + 1/4 + ....+ 1/n,或者1/2 + 1/3 + 1/4 + ....+ 1/n
两者的区别是是否min 一开始等于第一个数,还是min一开始是个很大的数。

理解方式在24楼
证明在69楼
Bule 2011-11-17
  • 打赏
  • 举报
回复
支持12楼,先跟最小的比较,不管结果怎么样,都得比较,因此,至少要比较n次,然后再看要不要和最大的比,概率为50%。因此,结果应该是1.5n。
lg_asus 2011-11-17
  • 打赏
  • 举报
回复
最后一次回帖了:
设数组source,min=max=source[0],从第2个数(也就是source[1])开始比较
则第1种是2(N-1)次
第2种:假定要先和max比较,在比较第i个数时,则max是前i-1个数中最大的,因此第i个数比max大的概率(1/2)^(i-1),比max小的概率是1-(1/2)^(i-1),也就是说有这么大的概率要再和min进行比较,所以比较次数就是1+(1-(1/2)^(i-1)),即2-(1/2)^(i-1), 极限求和 i从2到N, 再和第1种情况相减,结果是1-(1/2)^(N-1)。结果比较怪异~
jimh 2011-11-17
  • 打赏
  • 举报
回复
第一次比较,任意两个随机数大小的概率确实是50%,毫无争议,如果最小值不变,那么每次都是50%。
关键是没比较一次,最小值都有可能变小,会影响下一次的比较结果,
所以,根据概率,应该是1/2,1/3,1/4......1/N-1,
CoderZhuang 2011-11-17
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 sq_zhuyi 的回复:]

第一种:(num-1)*2
第二种:(num-1)*1

用编程方式来表示就是:
min=max=array[0];
for(int i=1;i<array.Length;i++)
第一种:if(array[i]<min) min=array[i];if(array[i]>max)max=array[i];
第二种:if(array[i]<min) min=array[i];els……
[/Quote]

学习了!
defias520 2011-11-17
  • 打赏
  • 举报
回复
严重支持12楼!答案怎么明显还看不出,大家都钻到死胡同了,简单的问题想复杂了。
wsjrzjp 2011-11-17
  • 打赏
  • 举报
回复
说白了就是时间复杂度的问题
冰灵公主 2011-11-17
  • 打赏
  • 举报
回复
哦,没看清题,好复杂
冰灵公主 2011-11-17
  • 打赏
  • 举报
回复
数组可以排序的,排序后取第一个数和最后一个数应该就是最大和最小的了吧,不知道俺这样想对不对
636f6c696e 2011-11-17
  • 打赏
  • 举报
回复
这个是发散的趋向于正无穷
[Quote=引用 87 楼 chmlqw 的回复:]
如果我没有记错 1/2 + 1/3 + 1/4 + ....+ 1/n, 这个式子的极限应该就是1....
[/Quote]
加载更多回复(105)

111,125

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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