我把这个作为面试问题...
已排序的无限数组,并且从某个位置(我们不知道该位置)只有特殊符号“$”才会出现,我们需要在该数组中找到一个元素......
我给出了一个解决方案,例如获取 $ 的第一次出现,然后从 $ 对前一部分进行二进制搜索
找到第一次出现的 $ i 给出了解决方案,例如窗口大小增加 if (i,2i)
我给的代码是
#include<stdio.h>
int first(int *arr,int start,int end,int index)
{
int mid=(start+end)/2;
if((mid==start||arr[mid-1] != '$') && arr[mid]=='$')
return mid;
if(arr[mid]=='$')
return first(arr,start,mid-1,index);
else
{
if(arr[end] =='$')
return first(arr,mid+1,end,index);
else
return first(arr,end+1,(1<<index),index+1);
}
}
int binsearch(int *arr,int end ,int n)
{
int low,high,mid;
high=end-1;
low=0;
while(low<= high)
{
mid=(low+high)/2;
if(n<arr[mid])
high=mid-1;
else if (n >arr[mid])
low=mid+1;
else
return mid;
}
return -1;
}
int main()
{
int arr[20]={1,2,3,4,5,6,7,8,9,10,'$','$','$','$','$','$','$','$','$','$'};
int i =first(arr,0,2,2);
printf("first occurance of $ is %d\n",i);
int n=20;//n is required element to be found
if(i==0||arr[i-1]<n)
printf(" element %d not found",n);
else{
int p=binsearch(arr,i,n);
if(p != -1)
printf("element %d is found at index %d",n,p);
else
printf(" element %d not found",n);
}
return 0;
}
有没有更好的方法来解决上述问题?
而且我还想知道找到 $ 的第一次出现为什么我们应该只以 2 的幂移动窗口为什么不像 (i,3i) 这样 3
有人可以通过一些关于重复关系的信息..请帮助..