给定一个排序的数字数组,我如何找到小于x的数字大小

时间:2010-06-27 20:20:36

标签: algorithm binary-search

  

可能重复:
  finding all numbers less than x in a BST

如何修改二进制搜索以查找排序数组中小于某个数字的数字?

5 个答案:

答案 0 :(得分:2)

如果你有一个已排序的数字数组,只需找到排序数组中项目的插入点,即binary search algorithm。插入点的索引为您提供小于目标编号的元素数。

在你的评论中,你提出了两个好问题:

  • 如果号码不在列表中怎么办?

要处理此问题,请继续搜索,直到找到数字应存在的点(即当前元素大于x且前一个元素小于x的索引)。

  • 如果有重复怎么办?

要处理此问题,请不要在第一次找到元素时停止,而是继续搜索直到下限和上限相遇。如果你点击一个等于x的值,就像你找到一个太高的数字并继续平分一样。

答案 1 :(得分:2)

返回小于二进制搜索返回值的索引的所有数字。

答案 2 :(得分:0)

查找号码并查看索引。

答案 3 :(得分:0)

由于这是一个数字数组而不仅仅是可比较的对象,因此您可能需要查看interpolation search。如果数字是均匀分布的,它可以在O(log log n)时间内找到索引,而不是O(log n)。

答案 4 :(得分:-1)

二进制搜索低于给定数字的最大数字。一旦掌握了自己的职位,该职位也与您感兴趣的计数直接相关。

这个伪代码可以让你走上正轨,但我还没有测试过。 k =给定数字

while left < right
    mid = (left + right) / 2
    if arr[mid] >= k // too big, not interested
        right = mid;
    else             // maybe too small, try bigger values
        left = mid + 1

 right - 1 or left - 1 (they're equal) is the position you're after.

例如:8 11 13 20 50k = 19

left = 1, right = 5
mid = 3
arr[3] = 13 < 19 => left = 4

left = 4, right = 5
mid = 4
arr[4] = 20 >= 19 => right = 4

left >= right => left - 1 = 4 - 1 = 3 is the position you're after