算法第一课

前言

最早我接触的是java语言,我又时候会打击同学,或者同事吧,你这也看底层实现,别人底层实现一般都常用算法什么七七八八的,本来自己就菜,还去对算法是什么都不了解,就去刷了leetcode,虽然开始刷的时候拿一些办法能解决出来,但是发现后面越来越难,而且对算法的,什么内存浪费,时间复杂度,空间复杂度是什么都不了解吧,就感觉写出来就好了,从这一课开始总结自己算法的路程,路漫漫其修远兮,吾将上下而求索

在这里插入图片描述

什么是算法

算法这词就很模糊,我认为吧算法就是对最优解的找到最好的办法,虽然描述的也很模糊吧,就比如 1+1 = 2 ,哇,这么简单也是算法?对,这也是啊小学就入门的加法了,
在这里插入图片描述

算法的几大认识

因为我是主java开发的下面就拿我们java常说的结构来说了

数据结构

本开始的排版是先说复杂度在说基础的数据结构的,然后发现写到空间复杂度的时候要先说得从数据结构说起
因为我是主java开发的下面就拿我们java常说的结构来说了
在这里插入图片描述

这里既然说对算法的认识,那就得知道什么是数据结构,而数据结构也是算法的一个台阶吧
线性结构
我们认识的数组,链表,等,就这就没有了,还有的解释一下,既然说是线性了,其实理解成直线也可以比如衍生出来的栈,队列,等是不是就是横着的直线,与竖着的直线了

树结构的衍生也许多,从基本的二叉树到,AVL平衡树 到 红黑树,
如图二叉树
在这里插入图片描述


图的这个概念比较复杂在后面说,是什么呢?看到二叉树他可能就是向下找,而图呢【网上的一个图结构,后面会说哦,简单说可能一个值对应多个值,多对多的概念】
在这里插入图片描述

等其他数据结构

其他数据结构如我们HashMap的hash表结构就是我们基本的数据结构变种来的 线性结构+树,Redis的很多变种的数据结构,跳跃表啊,位图等
不知道是否常听的大厂面试的如LRU算法啊,常看到的拿LinkedList来实现LRU(缓存淘汰算法)底层实现是哈希链表

后面会慢慢说数据结构章节的

时间复杂度

前面说 1+1=2 ,这不就简简单单的计算?但是如果是要你从1到1000的求和呢?还是从1+2+3+…的运算?所以这就有一个时间的概念就跟在读书或者上学的时候总会遇到干饭王,干饭不积极,不积极的小伙伴应该是口算这到题目耽误了时间,所以在算法的世界里面也有来衡量算法的好坏,就是现在说的时间复杂度跟空间复杂的概念了

什么是时间复杂度?

我们拿 1到1000的求和来说吧,从1+2+3+…+1000与 拿俩头+尾的方式计算,
1+1000=1001
2+999=10001
3+998=1001

其实这题就跟1+10的概念是一样的只是我扩大范围了,其实不知道有的小伙伴又想到,这不跟我高中学的什么,什么等差数列一样?后一个比前一个的值大一的规律,没有错就是这样,对一种方式不同的求和方式方法,然后就有一种叫渐进式时间复杂度的概念

渐进时间复杂度

渐进式时间复杂度是什么呢?

对于一个算法,假设其问题的输入大小为n,那么我们可以用 O(f(n)) 来表示其算法复杂度(time complexity)。那么,渐进时间复杂度(asymptotic time complexity)就是当n趋于无穷大的时候,f(n) 得到的极限值。
可以理解为:我们通过计算得出一个算法的运行时间 T(n), 与T(n)同数量级的即幂次最高的O(F(n))即为这个算法的时间复杂度。例如:某算法的运行时间T(n) = n+10与n是同阶的(同数量级的),所以称T(n)=O(n)为该算法的时间复杂度。
算法的渐进分析就是要估计:n逐步增大时资源开销T(n)的增长趋势。【来自百度】

看到上面的介绍是否有点干燥呢?主要下面三点

  • 如果运行时间是常量级的复杂度就是常量表示【如总共一个数的求和你要多久,这里我相信小伙伴都是正常的基本是都知道的 所以时间复杂度就是 O(1)】
  • 只保留时间函数的最高阶 【我们求1+1000的计算公式是否就变成了 (1+n)*n/2 就变成了 0.5n+n了最高项 n了 时间复杂度就是 O(n)】
  • 如果时间函数存在最高阶想,则省略最高阶前的系数 【还是求一个数,但是不是给小伙伴去计算了可能给蜡笔小新的白神去计算了,可能白神计算慢点需要 倍数了 就 上面的 fn = 2n n表示计算数量,2表示白神需要计算的时间 所以省略最高阶数 时间复杂度就是 O(n)】

而就如上面的时间复杂度比较
其实还有一种常说的时间复杂度 O logn(数学中的对数,省去了底数)【还是拿白神的例子来说,白神通过学习加法计算的时间比上次的时间总是少了一半 第一次可能是 6分钟,第二次3就第三次就 1.5就指数减少,为什么提到指数嗯,就我们数学中有一个对数的概念 O(logN)】
O(1)<O(n)<O(Ologn)<O(n2)
小伙伴应该也听过很多算法的快慢 ,所以就有很多的时间复杂度
O(2)
O(mn)
O(n3)
O(n!)
O(mlogn)

这里就是我对时间复杂度概念的总结吧
在这里插入图片描述

空间复杂度

什么是空间复杂度

空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n))。比如直接插入排序时间复杂度是O(n^2),空间复杂度是O(1) 。而一般的递归算法就要有O(n)的空间复杂度了,因为每次递归都要存储返回信息。一个算法的优劣主要从算法的执行时间和所需要占用的存储空间两个方面衡量。 【百度百科】

就如我刚才介绍的我为什么要先介绍数据结构,不然空间复杂度的说明不好解释了,我们在学习编程语言的时候,应该都听到过需要我们使用什么都需要在内存空间开辟一块空间供我们编程语言默认的方言【为什么说方言呢?java的map可能在python叫字典,go还是叫map的但是他动态数组叫切片】来使用【就有一个中间值的概念】,还是拿java来说吧,从数组到集合的学习我们知道,list集合的实现是动态数组可以动态扩容的,这就有一个概念了叫空间复杂度的计算就如上面百度百科的 S(n)=O(fn)
从固定的大小数组到可以动态扩容的数组就是从常量到可改变的量
就跟前面提到的 时间复杂度是常量的概念所以这里的常量数组的空间复杂度也就是常量的概念 就等于 Sn = O(1) 但是一般我们还是拿O来说 O(1)常量的空间复杂度 O(1)
而动态的不知道我们就着 n 所以如动态数组的 空间复杂度就 O(n)
等就不继续说明了怕篇幅太啰嗦了吧,数据结构后面度会介绍的这些也会衬托出来

既然时间复杂度跟空间复杂度都说了不知道是否有小伙伴听过一个叫做时间复杂度跟空间复杂度的取值取舍

时间复杂度跟空间复杂度的取值

为什么说这个呢?因为这我相信应该听说过鱼与熊掌不可兼得,所以应该听过拿时间换空间,空间换时间的概念,比如我们说的HashMap拿空间换时间,不知道各位的去重实现是怎么实现比如双重循环去重的实现就是拿时间换空间[这个只是说法,比如我们拿map实现就是空间换时间了],

数据结构会在后面章节说的慢慢介绍,数据结构当然重要啊,刷leetcode的小伙伴应该看到什么栈啊,动态规划思想什么啊,贪心等等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值