一个关于查找的问题


有一个文件(或数组)值为 从 1 到 n ;从中移除 3 个数字,之前的顺序也被打乱,重新放到一个文件(或n-3的数组中)。
求一个效率高点的算法 查找被移除的 3 个数字,最好再用程序实现,语言不限。设 n = 10000

java php 算法 JavaScript c

淡定的酱油党 12 years, 8 months ago

首先要用快速排序数组按从小到大的顺序排序,然后用两分法,按照如下的数组元素和
下标之间的关系进行快速查找。
记:D= 当前数组元素值 - 当前数组元素下标 - 1
D=0,说明当前数组元素的左边包括当前元素没有被移除的数值
D=1,说明当前数组元素的左边包括当前元素有1个被移除的数值
D=2,说明当前数组元素的左边包括当前元素有2个被移除的数值
D=3,说明当前数组元素的左边包括当前元素有3个被移除的数值

根据以上思路,可以用递归方式完成查找,java函数如下:

   
  //函数find寻找整数数组a中在区间[b,e]中被移除的c个数字,结果被打印到屏幕
  
void find(int[] a, int b, int e, int c){
if(c==0) return;
if(e==b+1){
if(c == 2){
System.out.println(a[b]);
System.out.println(a[e]);
}else{
if(a[e]==a[b])
System.out.println(a[b]);
else
System.out.println(a[e]);
}
return;
}
int m = (b + e)>>1;
int dm = a[m] - m - 1;
int db = a[b] - b - 1;
int d = dm - db;
if(d > 0){
find(a, b, m, d);
}
if(c>d){
find(a, m + 1, e, c-d);
}
}

Lrmax answered 12 years, 8 months ago

Your Answer