C语言关于时间复杂度详解

 更新时间:2022年01月07日 16:12:52   作者:爽爽不会编程  
大家好,本篇文章主要讲的是C语言关于时间复杂度详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览

一、时间复杂度

1.什么是时间复杂度?

空间效率,时间效率(较为关注)

时间复杂度:算法中的操作执行次数,为算法的时间复杂度。(不是具体时间,而是执行次数

2.如何计算?

时间复杂度

(1)是一个估算,看表达式中影响大的那一项,如N*N+2N+10中,N*N对整个式子影响最大,故其时间复杂度为N*N,用大O的渐近表示法O(N*N)。

(2)去掉时间表达式中的常数项乘积,例如,得到一个准确的时间表达式为2N+10,则估算得到的时间复杂度为O(N)

(3)对于多个未知数时,例如时间表达式为N+M,假设M,N差不多大,则O(M)或O(N);假设M远大于N,则O(M)。

(4)用常数1去替代所有确定的常数,如准确的时间表达式为100,O(1).

(5)未知数和常数,滤去常数。

(6)另外有些算法分为最好,最坏,平均这三种情况。当算法存在这三种情况时,选最坏的时间复杂度,例如假设字符串长度为N,“sdsfrsgtr...”,遍历字符串,求S的时间复杂度,最好O(1),最坏O(N),平均O(N/2)。

A.  在冒泡排序中,

     第一趟冒泡:N

     第二趟冒泡:N-1

     第三趟冒泡:N-2

     第N趟冒泡:1

     为等差数列,准确次数为:        N*(N+1)/2

冒泡排序时间复杂度为O(N*N)

B.  在二分查找/折半查找中:

假设二分了X次,有1*2*2....*2=N,2^X=N, X=(log2) N

算法的复杂度计算中,喜欢省略成logN,因为不好写底数,但是写成lg N,是错的。

C.  在某些阶乘的运算中求时间复杂度:

long long Factorial(size_t N)
{
   return N<2 ? N:Factorial(N-1)*N;
}

如Factorial(10),则返回factorial(9)*10,在返回到factorial(9)*8.....以此类推返回到

factorial(1)*2返回到1.(实际是10!)递归了N次,故时间复杂度为O(N)。(特别注意:结返回结果是N!,但是操作的次数是递归了N次,所以时间复杂度为O(N))

3.常见的时间复杂度:

查看源图像

 二、空间复杂度

1.什么是空间复杂度?

空间复杂度是算法运行过程中临时占用存储空间大小的量度,不在意其具体占了多少比特的大小,而是计算变量的个数。

2.如何计算?

对照时间复杂度的计算方法。注意:时间是累积的,空间是不累计的,空间可以销毁。

例题1:消失的数字

思路1:排序 0 1 2 3 4 5 6 7 9 一次比较,若下一个数与上一个数只差为1,则掠过,若下一个数比上一个数>1,则找到,但时间复杂度不符合。

思路2:把0到N加到一起,结果ret1,再把数组中的数加到一起ret2,ret1-ret2就是要找的数。

思路3:异或:相同为0,相异为1。将数组中的数与0-N数互相异或,最后剩下的那个数字就是缺的那个数。

int missingNumber(int* nums, int numsSize){
    int x=0;
    //先和数组的数进行异或
    for(int i=0;i<numsSize;++i)
    {
        x^=nums[i];
    }
    //在和0-N的数进行异或
    for(int j=0;j<numsSize+1;++j)
    {
        x^=j;
    }
return x;
}

要注意0-N数异或时,注意j<numsSize+1,它比原数组中元素个数多1。

 例题2:旋转数组

思路1:保存最后一个数,将其挪到前面来。k次

void rotate(int* nums, int numsSize, int k){
    for(int i=0;i<k;++i)
    {
    int tmp=nums[numsSize -1];
    for(int end=numsSize -2;end >=0;--end)
    {
        nums[end+1]=nums[end];
    }
    nums[0]=tmp;
    }
}

但此时时间复杂度为O(N*K),跑不过~

思路2:以空间换时间,尝试着多消耗一点空间,一次换成。将后K个保存,移到前面来,直接得到。时间复杂度为O(N),空间复杂度为O(N)

思路3:后K个逆置,前K个逆置,整体逆置(这个实在是太牛了!!)

 

 c代码为:

//逆置
void Reverse(int *nums ,int left,int right){
    while(left<right)
    {
        int tmp=nums[left];
        nums[left]=nums[right];
        nums[right]=tmp;
        ++left;
        --right;
    }
}
void rotate(int* nums, int numsSize, int k)
{
    //控制好下标,后N-K个
    Reverse(nums,numsSize-k,numsSize-1);
    Reverse(nums,0,numsSize-k-1);
    Reverse(nums,0,numsSize-1);
 
}

 注意结果可能出错:

 此时需要注意K是否大于N,当K>N时需要取模:k%=numsSize

添加:if(K>numsSize){ K%numsSize;}

//逆置
void Reverse(int *nums ,int left,int right){
    while(left<right)
    {
        int tmp=nums[left];
        nums[left]=nums[right];
        nums[right]=tmp;
        ++left;
        --right;
    }
}
void rotate(int* nums, int numsSize, int k)
{
    if(k>numsSize)
    {
        k%=numsSize;
    }
    //控制好下标,后N-K个
    Reverse(nums,numsSize-k,numsSize-1);
    Reverse(nums,0,numsSize-k-1);
    Reverse(nums,0,numsSize-1);
 
}

在力扣上运行得到:

总结

到此这篇关于C语言关于时间复杂度详解的文章就介绍到这了,更多相关C语言时间复杂度内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • VTK8.1 在 Qt5.9 环境下的配置编译和安装过程

    VTK8.1 在 Qt5.9 环境下的配置编译和安装过程

    为了实现realsense的PCL点云显示,需要VTK支持。由于整个平台在Qt环境实现,VTK编译为Qt插件。整个过程并不复杂,网上的文章大多不全,自己梳理了一下,分享出来,需要的朋友可以参考下
    2022-07-07
  • C++ 基础教程之虚函数实例代码详解

    C++ 基础教程之虚函数实例代码详解

    虚函数在 c++ 的继承体系中是一个非常重要概念,让我们可以在子类中复写父类的方法。这篇文章主要介绍了C++ 基础教程之虚函数实例代码的相关资料,需要的朋友可以参考下
    2020-02-02
  • C语言简明讲解队列的实现方法

    C语言简明讲解队列的实现方法

    队列(Queue)与栈一样,是一种线性存储结构,它具有如下特点:队列中的数据元素遵循“先进先出”(First In First Out)的原则,简称FIFO结构。在队尾添加元素,在队头删除元素
    2022-04-04
  • C语言详细分析宏定义的使用

    C语言详细分析宏定义的使用

    宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的替换。字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查,如有错误,只能在编译已被宏展开后的源程序时发现
    2022-04-04
  • Visual Studio Code上添加小程序自动补全插件的操作方法

    Visual Studio Code上添加小程序自动补全插件的操作方法

    这篇文章主要介绍了Visual Studio Code上添加小程序自动补全插件的操作方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • C语言实现排序算法之归并排序详解

    C语言实现排序算法之归并排序详解

    这篇文章主要介绍了C语言实现排序算法之归并排序,对归并排序的原理及实现过程做了非常详细的解读,需要的朋友可以参考下
    2014-07-07
  • 深入理解c++指针的指针和指针的引用

    深入理解c++指针的指针和指针的引用

    下面小编就为大家带来一篇深入理解c++指针的指针和指针的引用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考,一起跟随小编过来看看吧
    2016-06-06
  • C语言实现翻译功能

    C语言实现翻译功能

    这篇文章主要为大家详细介绍了C语言实现简单的翻译功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • 使用C++递归求解跳台阶问题

    使用C++递归求解跳台阶问题

    这篇文章主要介绍了使用C++求解跳台阶问题的方法,通过递归算法来解决,不算难,文中给出了计算思路,需要的朋友可以参考下
    2016-02-02
  • C语言中浮点数的精度丢失问题解决

    C语言中浮点数的精度丢失问题解决

    大家好,本篇文章主要讲的是C语言中浮点数的精度丢失问题解决,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01

最新评论