Java 排序数组中X的楼层和天花板

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的楼层和天花板。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
,对于ceil
if 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;
        }
    }