• 算法中时间空间复杂度说明


      在描述算法复杂度时,经常用到o(1), o(n), o(logn), o(nlogn)来表示对应算法的时间复杂度,这是算法的时间复杂度的表示。

    O后面的括号中有一个函数,指明某个算法的耗时与数据增长量之间的关系。其中的n代表输入数据的量。

    表达式 说明 示例
    O(1)

    最低时间复杂度,也就是耗时与输入数据大小无关,

    无论输入数据增大多少倍,耗时/耗空间都不变。

     哈希算法(无论数据规模多大,都可以在一次计算后找到目标,

    不考虑冲突的话)

    O(n) 数据量增大几倍,耗时也增大几倍。  遍历算法
    O(n²) 随着样本个数的平方数增长。 冒泡排序、选择排序
    O(logn) 

    当数据增大n倍时,耗时增大logn倍(这里的log是以2为底的,

    比如,当数据增大256倍时,耗时只增大8倍,

    是比线性还要低的时间复杂度) 

    1. 二分查找就是O(logn)的算法,每找一次排除一半的可能,

    256个数据中查找只要找8次就可以找到目标.

    2.欧几里德算法(求最大公因数);

    3.求幂;

    O(nlogn)

    n乘以logn,当数据增大256倍时,耗时增256*8=2048倍。

    这个复杂度高于线性低于平方。

    归并排序就是O(nlogn)的时间复杂度。

       上面的描述是不是描述的不是很清楚,我在刚开始看到的时候,也是有点琢磨不清的,后来在B站里面看到一个算法的视频,

    视频讲的很好,算法的复杂度呢,简单点说就是你写一个方法,计算时间的快慢程度,运算的越快,方法就越优秀;


      
    如果,你写一个算法,运算个十年二十年的,那恐怕是要凉凉了

      回归到问题的本质,O(n) 是什么?O(1) 又是什么?

      来看下 B 站的例子, 有 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29 ............. , 99 这样的一个数组集合,求他们所有的和;


    一:看到这个题目,我们首先想到的就是来个简单粗暴的方法,循环遍历,数组中有多少个元素,就循环多少遍,然后累加在一起;

     int[] list = new int[] { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29 };
    
     int sum = 0;
     for (int i = 0; i < list.Length; i++)
     {
         sum += list[i];
     }


    输出的结果为225;
    那么 ,这个算法的算法复杂度就是O(n) ,算法的复杂度取决于元素的个数;

    二:然后,我们进阶一下,升级一下我们的算法,首先我们观察下我们的元素,可以看出,这是个等差数列;根据等差数列的求和公式 (首项+末项)× 项数 ÷ 2;

     int[] list = new int[] { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29 };
    
     int sum = (list[0] + list[list.Length - 1]) * list.Length / 2;


    输出的结果同样为225;
    那么,这个算法的算法复杂度就是O(1),因为不用循环数组里面的元素,只需要计算一次就可以;


    通过上面的例子,可以知道,实现同样的结果有不同的方式,不同的方式有不同的算法复杂度,所以,我们在写每一个算法之前就需要考虑下这个算法的复杂度,高效简单的算法才是我们的追求;

    参考:https://blog.csdn.net/qq_34229351/article/details/80841482

  • 相关阅读:
    Fedora install chrome
    Ubuntu13.04 安装 chrome
    cjb
    屏蔽视频广告
    tars环境部署
    rpm包安装失败的解决办法
    Java环境变量配置错误
    Protobuf的安装使用
    fpm打包工具
    gcc6.3的安装
  • 原文地址:https://www.cnblogs.com/Rawls/p/11027975.html
Copyright © 2020-2023  润新知