在排序数组中查找元素

时间:2016-11-25 17:35:45

标签: arrays algorithm search time-complexity

给定排序数组A和元素x,我需要找到一个算法,该算法在xA中返回-1索引x不在A。 当d是Θ(logd)x之前显示的元素数量,或者A不在x时,算法的时间复杂度应为A ,d是x之前A之前的元素数。

二进制搜索不够好,因为最好的情况是O(1)。 我想从数组的开头开始,并开始检查2的幂的索引,但我迷路了。

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))时间。即便如此,它比早期退出的其他搜索更快,因为它每次迭代只进行一次比较。我在这里描述了其他优点:

How can I simplify this working Binary Search code in C?

答案 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正如预期!!

希望它很容易理解!!!!