📜  算法|搜寻|问题3

📅  最后修改于: 2021-06-28 19:53:13             🧑  作者: Mango

给定一个有序的整数数组,在给定数组中找到数字x的上限的最小最坏情况时间复杂度是多少?元素x的上限是数组中存在的大于或等于x的最小元素。如果x大于数组中存在的最大元素,则不存在天花板。例如,如果给定的数组为{12,67,90,100,300,399}且x = 95,则输出应为100。
(A) O(登录)
(B) O(n)
(C) O(登录)
(D) O(登录*登录)答案: (C)
说明:我们修改了标准的二进制搜索来找到上限。时间复杂度T(n)可以写成

T(n)<= T(n / 2)+ O(1)

可以通过Master方法获得上述复发的解决方案。它属于主方法的情况2。解决方案是O(Logn)。

#include

/ *函数以arr [low..high] * /的形式获取x的上限索引
int ceilSearch(int arr [],int low,int high,int x)
{
int mid;

/ *如果x小于或等于第一个元素,
然后返回第一个元素* /
if(x <= arr [low])
返回低

/ *如果x大于最后一个元素,则返回-1 * /
if(x> arr [high])
返回-1;

/ *获取arr [low..high] * /中间元素的索引
中=(低+高)/ 2; / *低+(高–低)/ 2 * /

/ *如果x与中间元素相同,则返回中* /
if(arr [mid] == x)
返回中间

/ *如果x大于arr [mid],则arr [mid + 1]
是x的上限还是arr [mid + 1…high]中的上限* /
否则if(arr [mid] {
if(mid + 1 <=高&& x <= arr [mid + 1])
返回中值+ 1;
别的
返回ceilSearch(arr,mid + 1,high,x);
}

/ *如果x小于arr [mid],则arr [mid]
是x的上限还是arr [mid-1…high]中的上限* /
别的
{
if(mid – 1> =低&& x> arr [mid-1])
返回中间
别的
返回ceilSearch(arr,low,mid – 1,x);
}
}

/ *检查上述功能的驱动程序* /
int main()
{
int arr [] = {1,2,8,10,10,12,19};
int n = sizeof(arr)/ sizeof(arr [0]);
int x = 20;
int索引= ceilSearch(arr,0,n-1,x);
如果(索引== -1)
printf(“%d的上限在数组”,x中不存在“;
别的
printf(“%d的上限为%d”,x,arr [index]);
getchar();
返回0;
}这个问题的测验