我在排序数组中有多次出现的键,并且我想对它们执行二进制搜索,普通的二进制搜索会为出现多次的键返回一些随机索引,其中我希望该键最后一次出现的索引。
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
好吧,感谢所有人,尤其是@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; }