c# – 二进制搜索算法的扩展,用于查找要在数组中搜索的键值的第一个和最后一个索引
作者:互联网
问题是扩展二进制搜索算法以最有效的方式查找排序数组中所有出现的目标值.
具体地说,算法的输入是(1)整数的排序数组,其中一些数字可能出现不止一次,以及(2)要搜索的目标整数.算法的输出应该是一对索引值,指示数组中第一次和最后一次出现的整数(如果确实发生的话).
源代码可以在c#,c,c中.
此外,我们可能需要查找索引的最大和最小比较数是多少?
解决方法:
如果你有点聪明,你可以定义两个不同的二进制搜索功能.一个将返回搜索值的第一个外观的索引,另一个将返回搜索值的最后一个外观.根据您对二进制搜索的了解,您应该能够确定最大和最小比较次数.
在我看来,使用两个二进制搜索应该是平均最快的方法.例如,如果您只使用一个二进制搜索来查找第一个项目并在之后线性搜索,则最坏的情况是整个函数是相同的值.对于长度为10000的数组,这将在最坏的情况下进行10013次比较,而使用两次二进制搜索将在最坏的情况下为同一阵列进行28次比较.当然,使用相同大小的数组,二进制/线性搜索方法的最佳情况是14次比较,而两种二进制搜索方法的最佳情况是26次比较.
**更新
好的,这是一个二进制搜索,用于查找数组中元素的第一个外观.我会给你一个递归函数(你当然可以迭代并以其他方式优化它).这将在int的数组a中搜索int val.另外,我没有注意找到中点(如果阵列非常大,可能会出现问题).
int bs1(int a[], int val, int left, int right)
{
if(right == left) return left;
int mid = (right+left)/2;
if(val > a[mid]) return bs1(a, val, mid+1, right);
else return bs1(a, val, left, mid);
}
但是,您应该在返回一个它实际引用正确值的索引后进行检查,因为如果val不在数组中,则返回的索引将对应于大于val的下一个元素.
对此进行一些细微的更改将使函数找到最后一个元素.这样做的关键是正确使用比较器并记住整数除法总是截断.
标签:c,c-2,algorithm,binary-search,c-3 来源: https://codeday.me/bug/20190722/1498464.html