数据结构,递归算法时间复杂度

img


请问这两个时间复杂度怎么判断,有什么区别吗,我怎么感觉应该都是O(n)啊

时间复杂度是算法在运行过程中所需要的时间资源的度量,通常用“大O符号”表示。在计算时间复杂度时,通常关注算法的最坏情况下所需要的时间资源,因为最坏情况下的时间资源是算法所需要的最多的。

判断两个算法的时间复杂度,需要比较它们的“大O符号”。如果两个算法的时间复杂度都是O(n),那么它们的时间复杂度是相同的,即它们所需要的时间资源是同级别的。如果一个算法的时间复杂度是O(n),而另一个算法的时间复杂度是O(nlogn),那么它们的时间复杂度是不同的,即它们所需要的时间资源是不同级别的。

在实际应用中,通常选择时间复杂度较低的算法来解决问题,因为它们所需要的时间资源更少,效率更高。但是,在某些特定情况下,时间复杂度较高的算法可能会更适合,比如处理数据规模较小的问题时,时间复杂度较高的算法可能更容易实现和调试。

总之,判断两个算法的时间复杂度需要比较它们的“大O符号”,时间复杂度越低的算法效率越高,但在某些特定情况下,时间复杂度较高的算法可能更适合。

应该都是O(log2n)啊,每次递归n/2,就是减半

目测是抄错题了吧
你确定没有把T(n/2)+T(n/2)擅自合并成2T(n/2)吗,执行结果一样但是执行次数是完全不同的

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/690440
  • 这篇博客也不错, 你可以看下冒泡排序的最优时间复杂度为什么是O(n)
  • 除此之外, 这篇博客: 【数据结构与算法】时间复杂度和空间复杂度中的 线性阶O(N) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 代码示例:

    void Func2(int N)
    {
    	int count = 0;
    	for (int i = 0; i < 2 * N; i++)
    	{
    		count++;
    	}
    
    	int M = 10;
    	while (M--)
    	{
    		count++;
    	}
    
    	printf("%d\n", count);
    }
    

    很容易分析得出,Func2函数执行的基本操作次数为F(N)=2*N+10。那么根据大O渐进表示法,函数Func2的时间复杂度就是O(N)。

    代码示例:

    void Func3(int N,int M)
    {
    	int count = 0;
    	for (int i = 0; i < N; i++)
    	{
    		count++;
    	}
    
    	for (int i = 0; i < M; i++)
    	{
    		count++;
    	}
    
    	printf("%d\n", count);
    }
    

    很明显,Func3函数的时间复杂度为O(M+N)。一般情况下,时间复杂度的未知数用的都是N,但是也可以用M、K等等字母。

    M远大于N,Func3函数的时间复杂度为O(M)
    N远大于M,Func3函数的时间复杂度为O(N)
    M和N差不多大,Func3函数的时间复杂度为O(M)或O(N)

    代码示例:

    long long Fac(int N)
    {
    	if (N <= 1)
    		return 1;
    	else
    		return Fac(N - 1) * N;
    }
    

    这是一个递归算法,那么递归算法的时间复杂度怎么计算呢?其实递归算法的时间复杂度=递归次数×每次递归调用的次数。那么Fac阶乘函数的时间复杂度就是O(N)。在这里插入图片描述

  • 以下回答由chatgpt基于相关博客总结生成:

    我可以解答该问题。

    对于递归算法的时间复杂度判断,可以采用递归树法来解决。递归树法将递归的执行过程用一棵树来表示,每个结点表示递归调用的一次运行,结点的深度表示递归的深度,每个结点代表的树分支汇聚到一起就构成了整个递归算法。我们可以计算递归树中每一层的结点数量,及每一层递归调用的总时间,从而得出整个递归的时间复杂度。对于大多数递归算法来说,时间复杂度都可以通过递归树法来计算。

    有一个需要注意的点是,不同的递归算法的时间复杂度可能同为O(n),但真正的时间复杂度差异会比较明显。比如,在求斐波那契数列时,普通的递归算法的时间复杂度是指数级的,但是使用记忆化递归算法后,时间复杂度就变成了线性的。所以我们要根据具体的算法实现,结合时间复杂度求解的方法,来正确地判断递归算法的时间复杂度。

    对于参考资料中的题目,如果要解决时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断一个单链表是否为回文结构,可以采用以下步骤:

    1. 判断链表非空,如果为空则不是回文结构
    2. 利用快慢指针找到链表的中间节点
    3. 对链表后半段进行翻转,将链表变为两个半段
    4. 依次比较两个半段的节点值,如果全部相等则为回文结构,否则不是

    对于缺失整数的问题,根据题目要求时间复杂度为O(n),可以采用异或的方法。因为一个数异或两次后会得到0,所以我们可以将0-n之间的所有数和数组中的数分别异或两次,得到的结果即为缺失的整数。

    对于时间复杂度为O(n)的排序算法,可以采用计数排序、基数排序、桶排序等方法。

    对于堆排序排升序建小堆的问题,虽然可以通过建小堆来进行升序排序,但是实际上这个方法的效率较低,建议还是采用建大堆的方法来进行升序排序。