Arrays 在无限排序数组中查找元素
我得到这个作为面试问题 无限数组被排序,从某个位置(我们不知道位置)只会有特殊的符号“$”,我们需要在该数组中找到一个元素 我给出了一个解决方案,比如获取$的第一次出现,然后从$对前一部分进行二进制搜索 为了找到$i的首次出现,我给出了类似于窗口大小增量的解决方案if(i,2i) 我给出的代码是Arrays 在无限排序数组中查找元素,arrays,algorithm,Arrays,Algorithm,我得到这个作为面试问题 无限数组被排序,从某个位置(我们不知道位置)只会有特殊的符号“$”,我们需要在该数组中找到一个元素 我给出了一个解决方案,比如获取$的第一次出现,然后从$对前一部分进行二进制搜索 为了找到$i的首次出现,我给出了类似于窗口大小增量的解决方案if(i,2i) 我给出的代码是 #include<stdio.h> int first(int *arr,int start,int end,int index) { int mid=(start+end)/2;
#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;
}
#包括
int first(int*arr,int start,int end,int index)
{
int mid=(开始+结束)/2;
如果((mid==start | | arr[mid-1]!='$')和&arr[mid]='$'))
中途返回;
如果(arr[mid]=='$')
首先返回(arr、start、mid-1、索引);
其他的
{
如果(arr[end]='$')
首先返回(arr、mid+1、end、索引);
其他的
首先返回(arr,end+1,(1对我来说似乎是一个很好的方法。作为一个小的优化,当您到达任何大于您正在搜索的数字时(不仅仅是$
),您可以停止first
例程
以2的幂增长窗口意味着您将在log_2(n)
迭代中找到终点。以3的因子增长意味着您将在log_3(n)
迭代中找到它,它更小。但不是渐近更小,因为O(log_2(n))==O(log_3(n))
。您的二进制搜索将采用log_2(n)
无论如何都要分步执行,因此加快第一部分的速度并不会帮助您的big-O运行时间。迭代格式的第一个函数的有效部分是
private int searchNum(int[] arr, int num, int start, int end) {
int index = 0;
boolean found = false;
for (int i = 0; i < arr.length; i = 1 << index) {
if (start + i < arr.length) {
if (arr[start] <= num && arr[start + i] >= num) {
found = true;
return bsearch(arr, num, start, start + i);
} else {
start = start + i;
}
} else {
return bsearch(arr, num, start, arr.length - 1);
}
}
return 0;
}
这就是python解决方案
arr = [3,5,7,9,10,90,100,130,140,160,170,171,172,173,174,175,176]
elm = 171
k = 0
while (True):
try:
i = (1 << k) - 1 # same as 2**k - 1 # eg 0,1,3,7,15
# print k
if(arr[i] == elm):
print "found at " + str(i)
exit()
elif( arr[i] > elm):
break
except Exception as e:
break
k = k+1
begin = 2**(k-1) # go back to previous power of 2
end = 2**k -1
# Binary search
while (begin <= end):
mid = begin + (end-begin)/2
try:
if(arr[mid] == elm):
print "found at " + str(mid)
exit()
elif(arr[mid] > elm):
end = mid-1
else:
begin = mid+1
except Exception as e:
# Exception can occur if you are trying to access min element and that is not available. hence set end to mid-1
end = mid-1
print "Element not found"
arr=[3,5,7,9,10,90100130140160170171172175176]
elm=171
k=0
虽然(正确):
尝试:
i=(1 elm):
打破
例外情况除外,如e:
打破
k=k+1
begin=2**(k-1)#返回之前的2次方
结束=2**k-1
#二进制搜索
while(beginelm):
结束=中间1
其他:
开始=中间+1
例外情况除外,如e:
#如果您试图访问min元素但该元素不可用,则可能会发生异常。因此,请将end设置为mid-1
结束=中间1
打印“未找到元素”
问题的第二部分(在找到$sign后)与[注意-这不是一个傻瓜,但是,没有投票关闭或任何事情]
if ((pos = searchNum(arr, num, 0, 2)) != -1) {
System.out.println("found @ " + pos);
} else {
System.out.println("not found");
}
arr = [3,5,7,9,10,90,100,130,140,160,170,171,172,173,174,175,176]
elm = 171
k = 0
while (True):
try:
i = (1 << k) - 1 # same as 2**k - 1 # eg 0,1,3,7,15
# print k
if(arr[i] == elm):
print "found at " + str(i)
exit()
elif( arr[i] > elm):
break
except Exception as e:
break
k = k+1
begin = 2**(k-1) # go back to previous power of 2
end = 2**k -1
# Binary search
while (begin <= end):
mid = begin + (end-begin)/2
try:
if(arr[mid] == elm):
print "found at " + str(mid)
exit()
elif(arr[mid] > elm):
end = mid-1
else:
begin = mid+1
except Exception as e:
# Exception can occur if you are trying to access min element and that is not available. hence set end to mid-1
end = mid-1
print "Element not found"