一尘不染

使用二进制搜索的多个键的最后索引?

algorithm

我在排序数组中有多次出现的键,并且我想对它们执行二进制搜索,普通的二进制搜索会为出现多次的键返回一些随机索引,其中我希望该键最后一次出现的索引。

int data[] = [1,2,3,4,4,4,4,5,5,6,6];
int key = 4;
int index = upperBoundBinarySearch(data, 0, data.length-1, key);

Index Returned = 6

阅读 285

收藏
2020-07-28

共1个答案

一尘不染

好吧,感谢所有人,尤其是@Mattias,这种算法听起来不错。无论如何我已经完成了自己的工作,这似乎可以给我更好的结果,但是如果有人可以帮助我确定algos
mine和@Mattias的复杂性,或者有人可以提供更好的解决方案,那就欢迎…。无论如何,这是我找到的解决方案,

int upperBound(int[] array,int lo, int hi, int key)
{
    int low = lo-1, high = hi;
    while (low+1 != high)
    {
        int mid = (low+high)>>>1;
        if (array[mid]> key) high=mid;
        else low=mid;
    }
    int p = low;
    if ( p >= hi || array[p] != key )
        p=-1;//no key found
    return p;
}

这是第一次出现,我也更新与另外一个类似的帖子同样第一次出现在二进制搜索

int lowerBound(int[] array,int lo, int hi, int key)
{
    int low = lo-1, high = hi;
    while (low+1 != high)
    {
        int mid = (low+high)>>>1;
        if (array[mid]< key) low=mid;
        else high=mid;
    }
    int p = high;
    if ( p >= hi || array[p] != key )
        p=-1;//no key found
    return p;
}
2020-07-28