问题
Given a sorted array A
and an element x
, I need to find an algorithm that returns the index of x
in A
or -1
if x
is not in A
.
the time complexity of the algorithm should be Θ(logd)
when d is the number of elements that appears before x
in A
, or if x
is not in A
, d is the number of elements that were before x
if he was in A
.
Binary search is not good enough because its best case is O(1). I thought of starting from the beginning of the array, and start checking the indexes that are powers of 2. but I got lost.
回答1:
You can do it like this: It uses Θ(log d) steps to find a range of size Θ(d), and then does a binary search in that range in another Θ(log d) steps.
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);
}
Note that the binary search I use does not exit early, and always takes Θ(log (limit-pos)) time. Even so it's faster than other searches that do exit early, because it does only one comparison per iteration. I describe other advantages here:
How can I simplify this working Binary Search code in C?
回答2:
I have a simple python
implementation based on the power of 2's
approach as discussed in the comments section. Please have a look:
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()
Firstly, it tries to find the target element by moving over indexes with a power of 2.
At any point if the current element exceeds the target element, then we do a binary search
between the current index(current power of 2) and the previous index(previous power of 2).
The time complexity of the searching process is logd
on an average. Also the best case time complexity is logd
as expected!!
Hope it is easy to understand!!!!
来源:https://stackoverflow.com/questions/40810090/find-element-in-a-sorted-array