《算法学习》 一:为什么要学习算法?时间复杂度

前言:

最近有社友在问,有没有算法方面的资料,说我最近面试经常被问到。例如冒泡排序、插入排序、选择排序、二分法等等。

为什么要学习算法和结构?

  1. 面试必问,面试官一上来,就让你写一个冒泡排序 ,你一脸懵逼,心想啥是冒泡排序,这就尴尬了,只能跟这家公司说good bye了,继续开始你的面试之旅。

  2. 作为一个开发人员,你想在这条道路上越走越远,算法是必学的,大部分的人员都是忙于框架学习,而忽视那些底层基础学习。
    随着这几年技术的不断更新,框架也一直在迭代,记得我15年刚刚出来的时候,那时候,大部分的公司还是用的spring mvc,而现在基本上都是dubbo,springboot,springcloud等等。18年,19年最近两年,不断有员工被劝退,而一个java岗位,至少有上千人竞争,要想从这里面脱颖而出,就需要拿出自己的真功夫。
    学习算法,能提高我们的逻辑思维能力,例如gc回收算法,了解算法能让我们更了解底层,能让我们更好了解,设计算法的人员为什么要这样设计,而不是拿来主义,天天就搬搬砖。

怎么看一个算法流程的好坏?

我们主要看他的时间复杂度和空间复杂度。

时间复杂度:

常数时间的操作:一个操作如果和数据量没有关系,每次都是
固定时间内完成的操作,叫做常数操作。例如1+1计算,内存寻址等等都叫常数操作。时间复杂度公式用O(1)表示。

时间复杂度为一个算法流程中,常数操作数量的指标。常用O(读作big O)来表示。具体来说,在常数操作数量的表达式中,只要高阶项,不要低阶项,也不要高阶项的系数,剩下的部分如果记为f(N),那么时间复杂度为O(f(N))。

理解时间复杂度场景:

场景一:aN²+bn+1
    aN²是高阶项  a是高阶项
bn+1是低阶项
时间复杂度表达式为:O(N²)


场景二:1000N+1
1000N是高阶项  1000N是高阶项 1是低阶项
时间复杂度表达式为O(N)
那这两个算法,那个好?
第一个的指标是N²,第二个是N,这都不用想,肯定第二个好。如果指标一样都是N,再看系数,系数越小的,肯定越好。

空间复杂度:

一个算法的空间复杂度包括算法程序所占用的空间,输入初始数据所占用的空间以及算法执行过程中所需要的额外空间。

大家看到这里,是不是一脸懵逼的。隔壁小王写了一个算法,花了10s,用了1k的内容。10s就是时间复杂度,1k就是空间复杂度。

实战:给大家一个理解时间复杂度的例子

假设有一个有序数组,让你找一个数,长度为N。让你设计一个算法
算法流程1:从头到尾一个个找,找到相等就停止运行。
算法流程2:利用二分法,把数据一分为二,判断是不是在该区间内。
写出2个流程,对应的表达式?分析好坏
第一个:复杂度表达式为O(N)
第二个:复杂度表达式为O(logN),不写以什么为底,默认就是以2为底。
假设数据长度为8,
第一次,    最差的情况需要8次
第二次,    最差的情况是需要3次。
注意:时间复杂度都以最差的情况,进行表示。因为数据是不确定的,所以,我们判断的时候都是以最差的情况表示。例如数组[1,2,3,4,5],通过第一种,找到2,第一个流程是1次,第二个流程是3次,我们能说第二个算法比第一个差吗?当然不行的。因为在实际的应用中,是无法确定数组的长度为多少的。  

公众号:程序猿学社

每周实时更新

发布了261 篇原创文章 · 获赞 344 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/qq_16855077/article/details/103843807