Java 排序数组中X的楼层和天花板
从已排序的数组中查找数字X的楼层和天花板。e、 g a[]={3,7,9,10,15}Java 排序数组中X的楼层和天花板,java,arrays,algorithm,binary-search,Java,Arrays,Algorithm,Binary Search,从已排序的数组中查找数字X的楼层和天花板。e、 g a[]={3,7,9,10,15} 如果X=2,楼层=N/A,天花板=3 如果X=3,楼层=3,天花板=3 如果X=4,楼层=3,天花板=7 如果X=16,楼层=15,天花板=N/A 我想我们大多数人都知道这个解决方案,也就是说,我们可以通过改进的二进制搜索找到地板/天花板。但改进的二进制搜索的问题是我们需要考虑很多边界条件。但我发现同样的二进制搜索算法确实有效,但对于floor,我们只需编写if low>high return low,对
- 如果X=2,楼层=N/A,天花板=3
- 如果X=3,楼层=3,天花板=3
- 如果X=4,楼层=3,天花板=7
- 如果X=16,楼层=15,天花板=N/A
if low>high return low
,对于ceilif low>high return high
。如果下限返回-1,则显示N/A,如果ceil返回的值大于数组索引,则显示N/A
地板算法:
intfloorSearch(inta[],intlow,inthigh,intx)
{
如果(低>高){
低回报;
}
int mid=(低+高)/2;
如果(a[mid]>x){
返回地板搜索(a、低、中1、x);
}
否则,如果(a[中]高){
高回报;
}
int mid=(低+高)/2;
如果(a[mid]>x){
返回ceilSearch(a、低、中1、x);
}
else if(a[mid]提示如何进行验证:
这些算法的正确性证明将遵循算法的递归结构;即使用结构归纳证明(查找)
看一看标准二进制搜索的证明,找出它是如何构造的
如果代码中有错误,那么您应该找不到正确性的证明;请参阅其他注释和其他答案
由于您只修改了条件if(low>high)
,请注意这与普通二进制搜索中的条件等价。理解二进制搜索的证明,在这里确定正确性几乎是微不足道的。代码中有一个传统错误。它使用int mid=(low+high)/2、
。如果数组非常大,则加法溢出可能导致负结果,使中间为负
这个错误可以通过使用int mid=(低+高)>>>1;
来修复,就像在java.util.Arrays二进制搜索方法中所做的那样。>>1
实际上是无符号除以2。下面是一个测试用例,它将破坏您的ceilSearch代码。
a={3,7,9,11,13},x=10。
我在每个递归调用中列出了low、high和mid:
(0,4,2)->a[2]=9a[3]=11>x
(3,2,2)->低>高,返回低=2。
正确答案应该是3,而不是2。我不太确定你问的是什么,我知道地板和天花板的定义似乎与你问的不匹配。你能详细说明一下吗?@Huntermillen编辑,我错换了def。谢谢。如果你需要/需要提供正确性证明的话对于这个算法:1)你需要自己尝试一下,2)StackOverflow可以说是离题的。(如果你已经尝试过了,那么告诉我们你尝试了什么,以便有人能给你一个提示……)@ JimMischel -不,这不是对CODIEVIEW的请求。程序的证明是真正的编程活动,所以这个问题是关于这方面的话题。@尝试奇怪的没有人指出它,但是你的算法是错误的。考虑<代码> A<代码> =代码> [1,2,5,7,8]
。这里的下限值6应该是5,但您的算法将返回7。答案与主题无关。我知道这一点,但问题是另一回事。无论如何,谢谢。@尝试这个问题是为了验证代码是否正确。答案不是。
int floorSearch(int a[], int low, int high, int x)
{
if(low > high){
return low;
}
int mid = (low+high)/2;
if(a[mid]>x){
return floorSearch(a, low, mid-1, x);
}
else if(a[mid]<x){
return floorSearch(a, mid+1, high, x);
}
else{
return mid;
}
}
int ceilSearch(int a[], int low, int high, int x)
{
if(low > high){
return high;
}
int mid = (low+high)/2;
if(a[mid]>x){
return ceilSearch(a, low, mid-1, x);
}
else if(a[mid]<x){
return ceilSearch(a, mid+1, high, x);
}
else{
return mid;
}
}