给定排序数组A
和元素x
,我需要找到一个算法,该算法在x
或A
中返回-1
索引x
不在A
。
当d是Θ(logd)
中x
之前显示的元素数量,或者A
不在x
时,算法的时间复杂度应为A
,d是x
之前A
之前的元素数。
二进制搜索不够好,因为最好的情况是O(1)。 我想从数组的开头开始,并开始检查2的幂的索引,但我迷路了。
答案 0 :(得分:1)
你可以这样做:它使用Θ(log d)步骤来找到大小Θ(d)的范围,然后在另一个Θ(log d)步骤中在该范围内进行二进制搜索。
int search(int[] array, int length, int valueToFind)
{
int pos=0;
int limit=min(length,1);
while(limit < length && array[limit] < valueToFind)
{
pos=limit+1;
limit = min(length, limit*2+1);
}
while(pos<limit)
{
int testpos = pos+((limit-pos)>>1);
if (array[testpos]<valueToFind)
pos=testpos+1;
else
limit=testpos;
}
return (pos < length && array[pos]==valueToFind ? pos : -1);
}
请注意,我使用的二进制搜索不会提前退出,并且始终采用Θ(log(limit-pos))时间。即便如此,它比早期退出的其他搜索更快,因为它每次迭代只进行一次比较。我在这里描述了其他优点:
答案 1 :(得分:1)
我根据评论部分中讨论的python
方法的强大功能实现了一个简单的2's
实现。请看一下:
def binary_search(nums,low,high,x):
while low<=high:
mid = (low+high)/2
if nums[mid]==x:
return mid+1
elif nums[mid]>x:
high = mid-1
else:
low = mid+1
return -1
def find_index(nums,x):
i = 1
l = len(nums)
while i<l:
if nums[i-1]==x:
return i
elif 2*i<l and nums[2*i-1]>x:
return binary_search(nums,i-1,2*i-1,x)
i = 2*i
return binary_search(nums,i/2,l-1,x)
def main():
line = raw_input("Enter numbers: ").split()
nums = []
for ele in line:
nums.append(int(ele))
nums = sorted(nums)
print "Sorted array: ",nums
x = int(raw_input("Enter the element to find in sorted array: "))
print find_index(nums, x)
main()
首先,它尝试通过移动幂为2 的索引来查找目标元素。
如果当前元素超过目标元素,那么我们在当前索引(当前功率2)和之前的索引(之前的索引)之间执行binary search
2)的力量。
搜索过程的时间复杂度平均为logd
。同样最好的案例时间复杂度是logd
正如预期!!
希望它很容易理解!!!!