Algorithm 由递归算法确定递推关系

Algorithm 由递归算法确定递推关系,algorithm,math,recursion,Algorithm,Math,Recursion,我得到了下面的递归算法,并被要求找到它的递归关系 int search(int A[], int key, int min, int max) { if (max < min) // base case return KEY_NOT_FOUND; else { int mid = midpoint(min, max); if (A[mid] > key) return searc

我得到了下面的递归算法,并被要求找到它的递归关系

int search(int A[], int key, int min, int max)
{
    if (max < min)      // base case
       return KEY_NOT_FOUND;
    else
    {
       int mid = midpoint(min, max);

       if (A[mid] > key)    
          return search(A, key, min, mid-1);
       else if (A[mid] < key)
          return search(A, key, mid+1, max);
       else
          return mid;       // key found
    }
}
int搜索(int A[],int键,int最小值,int最大值)
{
if(max键)
返回搜索(A、键、最小值、中间值-1);
else if(一个[mid]<键)
返回搜索(A,键,中间+1,最大值);
其他的
return mid;//找到密钥
}
}

解决方案是
T(n)=T(n/2)+1
,但我不确定为什么是
T(n/2)
?为什么是
+1
+1
是因为递归需要恒定的时间吗?还是怎样有人能理解这个解决方案吗?

您的代码是二进制搜索的实现。在二进制搜索中,每次递归调用时,您都会将已排序的数组分成两半,然后在数组左侧搜索元素(如果元素小于中间元素),或者在数组右侧搜索元素(如果元素大于中间元素),或者在查找中间元素时停止搜索

现在,如果n显示排序数组中的元素数,每当您将其拆分为两个几乎相同大小的数组时,问题大小将减少到n/2,并且由于在n/2数组上只调用搜索函数一次,您可以轻松地说:

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


O(1)加法是因为如果你运行以检查你处于哪种状态。

你认为解决方案是什么,为什么?该解决方案由我们的讲师提供,但我不确定他是如何得到该解决方案的。因此,这就是为什么我问你希望答案是什么?如果你找不到,那么是时候进一步阅读了。如果你给出了一个错误的答案,把它贴在这里,这样我们可以帮助你。解决方案在于
给定一组长度为“n”的数据,算法需要多少次才能退出
这里有一个带有一些示例的文档:另一个提示:识别使算法“运行”的变量很重要。任何常量都可以排除(看起来微不足道,但我看到人们对伪变量感到头疼),有些变量可能是实际输入的导数。例如:
inta[]
做的不多,另一方面它的长度做的很多;对我来说已经有一段时间了,所以可能我弄错了;-)仅仅通过检查代码(没有任何二进制搜索算法的先验知识),我们如何了解n/2?这是中点计算吗?为了回答这个问题,你应该确定你知道n实际上是什么!n是输入数组中的元素数,也是确定问题大小的参数。现在,如果你把这个数组分成两半,就像你的代码那样,问题的大小是n/2,因此你在计算中得到了n/2。至于您在理解递归关系方面的问题,您不能期望不理解代码,而是能够计算其复杂性!我想如果你真的了解函数中的“min”和“max”参数,你就可以开始了。