C 利用二进制搜索算法

C 利用二进制搜索算法,c,algorithm,C,Algorithm,我对思考过程比对代码本身更感兴趣。我应该找到排序数组中v[I]组件的数量,这样x

我对思考过程比对代码本身更感兴趣。我应该找到排序数组中v[I]组件的数量,这样x,其中xy作为键盘输入发送。 我应该使用改进的二进制搜索来有效地解决这个问题,而不是通过向量进行常规搜索

我的问题是,在这种情况下,我无法想象如何实现二进制搜索,这种方法似乎不适合我


有什么想法吗

您可以在数组中对
x
y
进行二进制搜索。然后你可以从
y
的索引中减去
x
的索引,得到它们之间的项目数

实际上,您必须从结果中减去1,因为您使用的是严格小于

例如,假设您有一个数组:

[3, 6, 8, 10, 14, 39, 41, 100]
设x=8,y=39

x的指数是2,y的指数是5

5-2=3

3-1=2


如果允许
x
y
为数组中不包含的值,则仍然可以采用相同的方法。搜索
x
,如果未找到,则使用刚好大于x的元素索引。同样,对于仅小于
y

的元素索引,假设原始数组v已排序,只需执行以下步骤:

  • 使用二进制搜索来定位数组中的值x——如果它不在数组中(二进制搜索中的上下界相交),则获取最接近的较高值的索引
  • 对y值执行同样的操作,如果不是这次,则获取最接近的较低值的索引
  • 找出中间有多少项(减去指数,再加1)

  • 如果您感兴趣,这里有一篇很棒的文章:

    根据
    x
    y
    的值,如果它们分别是数组中数字的下限和上限,则只需应用具有这些限制的常规BS算法,而不是数组的常规第一个和最后一个元素


    把它写在纸上会有帮助。

    数组
    v
    排序了吗?是的,我忘了提了,非常感谢!只需找到节点
    v[i]
    ,然后转换树墙,如果x和y不在数组中怎么办?@user43389您必须找到最接近的上方(
    x
    )和下方(
    v[i]
    )。一旦你找到了一个极限,你就可以用它来搜索另一个极限。知道了,非常感谢,我不太确定如何进行编码部分,但我想不会那么难。非常感谢@user43389如果你知道如何进行二进制搜索,那完全是一样的。只需使用两个不同的值调用二进制搜索函数两次,
    x
    y
    。然后减去指数。