我想修改着名的binary search算法来返回下一个更大的项目的索引而不是被搜索的密钥 .
所以我们有4个案例:
-
键小于所有项目,返回0 .
-
键大于所有项目,返回items.length .
-
在索引x处找到密钥,返回x 1 .
-
找不到密钥,返回下一个更大的索引 .
例如:
data = { 1, 3, 5, 7, 9, 11 };
-
搜索0返回0 .
-
搜索11或12个返回6 .
-
搜索5或6返回3 .
while (low <= high) {
mid = (low + high) / 2;
if (data[mid] < val)
low = mid + 1;
else if (data[mid] > val)
high = mid - 1;
else {
break;
}
}
目前通过检查低值和高值来实现它 . 有没有有趣的代码可以这样做!
编辑!!!
这是我如何使它工作:
if (low <= high)
found = (low + high) / 2 + 1;
else if (low >= data.length)
found = data.length ;
else if (high < 0)
found = -1;
else
found = low;
我正在寻找一种更优雅的方式!
编辑II !!!
如果没有重复,此代码有效 . 要处理重复的情况,我们需要修改第一个if条件:
if (low <= high)
found = (low + high) / 2 + 1;
迭代直到找到更大的元素 .
3 回答
以下是满足OP搜索要求的一些C代码:
value <第一项:返回0
值包含在数组中:返回索引找到1
值不在数组中,但<第一项和<最后一项:返回下一个最大值的索引
value> =最后一项:返回数组大小
它还演示了4种不同类型的二进制搜索:
标准二进制搜索
LessThanEqual二进制搜索
LessThanEqual或Last Binary Search
NextLargest二进制搜索
(它假设
data
中没有重复项)输出:
1st
列是标准二进制搜索2nd
列是Less Than二分法搜索3rd
列是Less Than Or Last二进制搜索4th
列是Next Largest二进制搜索这是一个代码:
如果搜索的元素不在数组中,则
如果搜索大于数组最大元素的元素,则
这就是你想要的 . 它返回下一个更大的元素 .