Algorithm 求递归算法的时间复杂度

Algorithm 求递归算法的时间复杂度,algorithm,time-complexity,Algorithm,Time Complexity,我在解决一些与查找算法的时间复杂性相关的问题时遇到了这个问题。这让我很难计算出这个函数的时间复杂度。代码片段的图像附在下面。有人能帮我理解这一点,并向我简要介绍如何处理这类问题吗?非常感谢 请不要将此问题标记为重复问题! 简单的情况:假设数组只有不同的元素 由于这个假设,最后一行return search…()+1+search…()在执行期间最多可以执行一次 因此,在每次递归调用时,数组中搜索区域的大小除以2(并减去1);除了最多一次有两个递归调用而不是一个 当搜索区域达到大小0时,执行结束

我在解决一些与查找算法的时间复杂性相关的问题时遇到了这个问题。这让我很难计算出这个函数的时间复杂度。代码片段的图像附在下面。有人能帮我理解这一点,并向我简要介绍如何处理这类问题吗?非常感谢

请不要将此问题标记为重复问题!

简单的情况:假设数组只有不同的元素 由于这个假设,最后一行
return search…()+1+search…()
在执行期间最多可以执行一次

因此,在每次递归调用时,数组中搜索区域的大小除以2(并减去1);除了最多一次有两个递归调用而不是一个

当搜索区域达到大小0时,执行结束

最初,搜索区域的大小为
N
:它是整个数组

在达到值
1
之前,我们可以将
N
除以
2
多少次,然后再减去1得到0

这个问题是众所周知的,因为它经常发生在算法中;答案是,关于
log2(N)

因此,最多会有
log2(N)
递归调用,除非有一次执行可能会拆分为递归调用;因此,将在
log2(N)
2 log2(N)
递归调用之间进行调用。每个递归调用都是固定时间的;因此,执行的总时间是
Θ(log(N))

退化情况:所有元素都等于
k
在这种情况下,两个
if
条件
V[mid]k
都不会为真;hencewe将始终处于第一种情况(
返回0
)或最后一种情况(
返回…+1+…

在这种情况下,函数的最终返回值将是
N
,因为函数正在计算数组中
k
的出现次数。由于返回值仅由
+1+
生成,因此必须有确切的
N
调用,每个调用贡献一个
+1+
;在触发的两个递归调用中,最多两个立即返回0;因此递归调用的总数必须至少为
N
,最多为
3*N
。因此,复杂性是
Θ(N)

“一般”案件 数组中可能出现一次以上的
k
。出于与前面所述相同的原因,算法的复杂性应为
Θ(K+log(N))
,其中
K
K
的出现次数,
N
是数组的大小。最好的情况是
Θ(log(N))
,最坏的情况是
Θ(N)
。作为总结,它是
O(N)

平均复杂度 如果我们假设输入数组是按照已知的概率分布随机生成的,那么我们可以计算复杂性的期望值。这通常被称为“平均复杂度”。精确计算要困难得多,在这种情况下,假设中的概率分布似乎会发挥巨大作用,因此不同的分布将导致不同的平均复杂性。例如,如果数组中填充了在[0,10^N]范围内独立、均匀随机抽取的N个数字,那么
k
在数组中多次出现的概率极低,因此我猜在这种情况下的预期复杂性接近
log(N)
。然而,如果
N
数字是在[0,10]范围内随机抽取的,那么您可以预期十分之一的数字等于
k
,因此平均复杂度将接近
Θ(N/10)=Θ(N)


快速排序算法通常计算“平均复杂度”,假设一个列表随机均匀地洗牌。快速排序的最坏情况复杂性为Θ(N);其最佳情况复杂度为Θ(log(N))。它的平均复杂度假设一个均匀随机洗牌的列表是Θ(log(N))。这在许多计算机科学教科书中都得到了“证实”。然而,到目前为止,我读过的所有关于这个主题的教科书在某些方面都有些手摇;我还没有找到一本书能够以一种真正令人信服的方式处理证明,并具有人们期望的数学证明的严谨性。

这不是一种二进制搜索吗?然后是O(logn)。此函数的最坏情况是所有元素都等于
k
。每个递归调用都会将一个元素与
k
进行比较。将有多少元素与
k
进行比较?这是一个客观类型的问题,正确答案是O(N)。这就是我困惑的地方。最初我也认为它具有对数复杂性。