📌  相关文章
📜  用于排序数组中的天花板的 PHP 程序

📅  最后修改于: 2022-05-13 02:24:09.457000             🧑  作者: Mango

用于排序数组中的天花板的 PHP 程序

给定一个排序数组和一个值 x,x 的上限是数组中大于或等于 x 的最小元素,下限是小于或等于 x 的最大元素。假设数组按非降序排序。编写有效的函数来找到 x 的下限和上限。
例子 :

For example, let the input array be {1, 2, 8, 10, 10, 12, 19}
For x = 0:    floor doesn't exist in array,  ceil  = 1
For x = 1:    floor  = 1,  ceil  = 1
For x = 5:    floor  = 2,  ceil  = 8
For x = 20:   floor  = 19,  ceil doesn't exist in array

在下面的方法中,我们只实现了天花板搜索功能。楼层搜索可以以相同的方式实现。
方法一(线性搜索)
搜索 x 上限的算法:
1) 如果 x 小于或等于数组中的第一个元素,则返回 0(第一个元素的索引)
2) Else 线性搜索索引 i,使得 x 位于 arr[i] 和 arr[i+1] 之间。
3) 如果我们在第 2 步中没有找到索引 i,则返回 -1

PHP
= $x)
            return $i + 1;
    }     
      
    // If we reach here then x is greater 
    // than the last element of the array,
    // return -1 in this case 
    return -1;
}
  
// Driver Code
$arr = array(1, 2, 8, 10, 10, 12, 19);
$n = sizeof($arr);
$x = 3;
$index = ceilSearch($arr, 0, $n - 1, $x);
if($index == -1)
    echo("Ceiling of " . $x . 
         " doesn't exist in array ");
else
    echo("ceiling of " . $x . " is " . 
                        $arr[$index]);
  
// This code is contributed by Ajit.
?>


PHP
 $arr[$high])
        return -1; 
      
    /* get the index of middle
       element of arr[low..high] */
    // low + (high - low)/2
    $mid = ($low + $high)/2; 
      
    /* If x is same as middle element,
       then return mid */
    if($arr[$mid] == $x)
        return $mid;
          
    /* If x is greater than arr[mid],
       then either arr[mid + 1]    is 
       ceiling of x or ceiling lies 
       in arr[mid+1...high] */
    else if($arr[$mid] < $x)
    {
        if($mid + 1 <= $high && 
           $x <= $arr[$mid + 1])
            return $mid + 1;
        else
            return ceilSearch($arr, $mid + 1, 
                              $high, $x);
    }
      
    /* If x is smaller than arr[mid],
       then either arr[mid] is ceiling
       of x or ceiling lies in 
       arr[low....mid-1] */
    else
    {
        if($mid - 1 >= $low && 
           $x > $arr[$mid - 1])
            return $mid;
        else
         return ceilSearch($arr, $low, 
                           $mid - 1, $x);
    }
}
  
// Driver Code
$arr = array(1, 2, 8, 10, 10, 12, 19);
$n = sizeof($arr);
$x = 20;
$index = ceilSearch($arr, 0, $n - 1, $x);
if($index == -1)
    echo("Ceiling of $x doesn't exist in array ");
else
    echo("ceiling of $x is"); 
    echo(isset($arr[$index]));
  
// This code is contributed by nitin mittal.
?>


输出 :

ceiling of 3 is 8

时间复杂度: O(n)
方法 2(二分查找)
这里没有使用线性搜索,而是使用二进制搜索来查找索引。二分搜索将时间复杂度降低到 O(Logn)。

PHP

 $arr[$high])
        return -1; 
      
    /* get the index of middle
       element of arr[low..high] */
    // low + (high - low)/2
    $mid = ($low + $high)/2; 
      
    /* If x is same as middle element,
       then return mid */
    if($arr[$mid] == $x)
        return $mid;
          
    /* If x is greater than arr[mid],
       then either arr[mid + 1]    is 
       ceiling of x or ceiling lies 
       in arr[mid+1...high] */
    else if($arr[$mid] < $x)
    {
        if($mid + 1 <= $high && 
           $x <= $arr[$mid + 1])
            return $mid + 1;
        else
            return ceilSearch($arr, $mid + 1, 
                              $high, $x);
    }
      
    /* If x is smaller than arr[mid],
       then either arr[mid] is ceiling
       of x or ceiling lies in 
       arr[low....mid-1] */
    else
    {
        if($mid - 1 >= $low && 
           $x > $arr[$mid - 1])
            return $mid;
        else
         return ceilSearch($arr, $low, 
                           $mid - 1, $x);
    }
}
  
// Driver Code
$arr = array(1, 2, 8, 10, 10, 12, 19);
$n = sizeof($arr);
$x = 20;
$index = ceilSearch($arr, 0, $n - 1, $x);
if($index == -1)
    echo("Ceiling of $x doesn't exist in array ");
else
    echo("ceiling of $x is"); 
    echo(isset($arr[$index]));
  
// This code is contributed by nitin mittal.
?>

输出 :

Ceiling of 20 doesn't exist in array 

时间复杂度:O(Logn)

有关更多详细信息,请参阅排序数组中有关天花板的完整文章!