算法初步---基本的数据结构(java为例)
最近搞算法,觉得超级吃力的,一直以为数学好的,数学可以考试满分,算法一定没什么问题,贱贱地,我发现我自己想多了,还是自己的基础薄弱吧,今天我来补补最基础的知识。
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。
最简单的栗子,我们来计算1+2+3+4+...+100,我们逐个去算觉得好麻烦的。如果是加到200呢?加到500呢?这时就引出了我们的算法,高中数学就说过这个玩意,等差数列,也就是Sn=a1*n+[n*(n-1)*d]/2,我们带入公式来看一下。Sn = 1*100+ [(100*99)/2]
5050,应该和我们一个个来计算一样的吧。这个简单的栗子也就是我们的算法(现实中没有这么简单的),但从这个简单的栗子我们可以得到我给们要给予100个数字,我们就要计算100次,给出101个数字就要计算101次,那么我们给出n给数字也就是要计算n次啦
所以我们就说我们的时间复杂度为O(n)。这次我们又假如,我们去吃小龙虾,我们吃掉第一只小龙虾需要1分钟,吃第二只需要两分钟,吃第三只时候需要三分钟,那么我们吃掉n只龙虾需要多久呢?我们根据推算可以知道,我们需要 (n2+n)/2。时间复杂度即为O(n
2)
这时我们也就得到了时间复杂度为,保留最高阶,常数变为1的结论,去得出时间复杂度。
空间复杂度,也就是占用内存的大写啦,多次循环的时候,其实一直占用内存的,一直没有释放的,只要指针还在,我们的内存就没有释放的。一般也用O(n)来表示,运行几次就是几啦,记得把变量算进去。
说好的说数据结构,提前说了时间复杂度和空间复杂度,其实没有提前,说了这两个概念,后面的很多也就很好理解了。
线型结构:数组和链表。
数组:
数组就像是训练有素的士兵一样,报数1,2,3....我们可以通过他们的角标,得到他们的值,在java里的代表就是array啦。(在这里说一下,数据的操作一般都是增删改查,我们干过web的都知道啦)
增:如果是尾部插入,直接给予新的角标,给予值就可以了,头部新增,需要把所有元素向后移动,中间插入也是如此的,在这里简单的说一下扩容,数组的每次扩容的2倍的,例如我们第一次占用4个单位,不够用了,我们需要扩容,直接扩展到8位(即使用不完8位,也扩容到8位)时间复杂度O(n)。
删:删除也是如此,每次是需要移动剩余元素的,时间复杂度即为O(n)
改:直接去改就可以啦,时间复杂度为O(1)
查:刚才我们说了,数组是有角标的,我们直接通过角标就可以得到他们了,所以时间复杂度为O(1)
说了这些我们得到了数组的查询表现还是很好的。
链表:
刚才说的数组像士兵一样,有着整齐的队伍,那么链表就像是地下党一样,只是单线联系,我只是知道我的下级是谁,不知道我们的组织里其他人。只是通过他们的next指针去得到下一项。
增:在这里链表新增就简单很多了,只要找到自己要放置的位置,把指针指向他,他的指针指向他的下级就可以了,也就是说时间复杂度为O(1)
删:删除也是如此的,我们删掉了自己,把原来指向自己的指针调整到指向我们指针原来指向的位置就可以了,时间复杂度为O(1)
改:我们这里提要的修改,都是指不考虑查过程消耗的所有,也就是我们找到直接改就可以啦,时间复杂度为O(n)
查:我们需要从大哥找起,问他你的下线是谁?不是我们要的,我们继续询问他的下级,所以时间复杂度为O(n)
---------------------华丽的分割线-------------------------
栈:
栈?可以理解为羽毛球桶吧。我们依次把每一个不同颜色的羽毛球装在桶内,但是我们每次只能拿出最外面的那个羽毛球,也就是说,栈,后进先出。
这里的栈主要操作就是入栈和出栈了,我们刚才也说了后劲先出,也就是说入栈和出栈只会影响到最后一个元素,不涉及其它元素的整体移动,时间复杂度为O(1)
队列:
队列就犹如隧道一样吧,或者理解为二极管,只能单向通电,也就是只能单向通过,我们也就可以得知,队列的数据一定是先进先出啦。
入队和出队,性质和栈基本都是一致的,唯一的就是先进先出。
队列其实还有双向队列(可以两头操作)和优先队列(自带VIP光环)。
---------------------华丽的分割线-------------------------
哈希结构:(散列表)
哈希?可以理解为坐卧铺火车吧,上车了(开始存),列车员会把我们的票换成他们的票(哈希函数执行),然后我们会到我们相应的铺位,等待下车。也就是key,value的形式来存的,java带表示HashMap,(jdk1.8里HashMap有新特性,以后会讲到)
新增:总共分两步,换票,上卧铺。也就是我们拿到key值进行hash计算,然后得到所对应的的位置,存储我们的值。
有时候会出现hash冲突的情况,我们一般用开放寻址和链表来解决冲突,如果太多了,会扩容,和数组扩容性质差不多,也是2倍的扩容。
查:通过hash函数将key哈希过来,得到位置,找到我们的值,冲突了,会找他的链表。
结构我们今天先说这些,貌似这些应该是结构基础的所有了吧。有遗漏的小伙伴可以提醒我一下,我不知道的,我去学习一下,再整理发给大家。晚安。
算法初步---基本的数据结构(java为例)的更多相关文章
- LeetCode算法题-Number Complement(Java实现-五种解法)
这是悦乐书的第240次更新,第253篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第107题(顺位题号是476).给定正整数,输出其补码数.补充策略是翻转其二进制表示的位 ...
- LeetCode算法题-Rotate String(Java实现)
这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...
- LeetCode算法题-Rotated Digits(Java实现)
这是悦乐书的第316次更新,第337篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第185题(顺位题号是788).如果一个数字经过180度旋转后,变成了一个与原数字不同的 ...
- LeetCode算法题-Toeplitz Matrix(Java实现)
这是悦乐书的第312次更新,第333篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第181题(顺位题号是766).如果从左上角到右下角的每个对角线具有相同的元素,则矩阵是 ...
- LeetCode算法题-Flood Fill(Java实现)
这是悦乐书的第306次更新,第325篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第173题(顺位题号是733).图像由二维整数数组表示,每个整数表示图像的像素值(从0到 ...
- LeetCode算法题-Image Smoother(Java实现)
这是悦乐书的第282次更新,第299篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第150题(顺位题号是661).给定表示图像灰度的2D整数矩阵M,您需要设计一个平滑器以 ...
- LeetCode算法题-Design LinkedList(Java实现)
这是悦乐书的第300次更新,第319篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第168题(顺位题号是707).设计链表的实现.您可以选择使用单链表或双链表.单链表中的 ...
- LeetCode算法题-Design HashMap(Java实现)
这是悦乐书的第299次更新,第318篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第167题(顺位题号是706).在不使用任何内置哈希表库的情况下设计HashMap.具体 ...
- LeetCode算法题-Design HashSet(Java实现)
这是悦乐书的第298次更新,第317篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第166题(顺位题号是705).不使用任何内建的hash表库设计一个hash集合,应包含 ...
随机推荐
- 浏览器关闭后Session真的消失了吗?
今天想和大家分享一个关于Session的话题: 当浏览器关闭时,Session就被销毁了? 我们知道Session是JSP的九大内置对象(也叫隐含对象)中的一个,它的作用是可以保 存当前用户的状态信 ...
- Android Studio 提高开发效率的插件
好久没有更新博客了,最近搞个listview搞得半死不活的,心累~~ 今天带来的是Android Studio插件的整理,全是我已经安装使用的,写这篇博文的目的也是因为我怕我自己给忘记怎么用(尴尬) ...
- mybatis关联关系映射
1.一对多关联关系 2.多对多关联关系 首先先用逆向生成工具生成t_hibernate_order.t_hibernate_order_item t_hibernate_book.t_hibernat ...
- python3之猜数字游戏
猜数字小游戏 # coding:utf-8 import random #利用random生成一个1-10的随机数 luckeyNum = random.randint(1,10) #限定猜的次数 l ...
- 完整版的CAD技巧!3天轻松玩转CAD,零基础也能学会
最近有很多小伙伴反应,CAD图纸学起来有点小困难,也许你还没能掌握技巧,CAD大神带你3天轻松玩转CAD,零基础也能快速学会. 一.看懂图纸是关键 CAD制图首先得让自己知道要绘制什么,如果心中对图纸 ...
- 专访腾讯方亮:WeTest品牌全面升级,“好的产品一定深谙人性”
工欲善其事,必先利其器.在当下竞争激烈的市场环境中,精品,已经成为所有游戏厂商安身立命之本.但如何提升品质,使产品成为精品,行业内却长期缺乏公开.透明,以及具备实际参考.实操价值的标准. 制定一项标准 ...
- 用css做三角形
<html> <body> <style> .trlangle{ width: 0; height: 0; border-left: 50px solid tran ...
- JSON解析(序列化和反序列化)
JSON的序列化,代码示例: NSDictionary *dic = @{}; if (![NSJSONSerialization isValidJSONObject:dic]) { NSLog(@& ...
- ABP进阶教程1 - 条件查询
点这里进入ABP进阶教程目录 添加实体 打开领域层(即JD.CRS.Core)的Entitys目录 //用以存放实体对象添加一个枚举StatusCode.cs //状态信息 using System; ...
- oracle 死锁 锁
[zhuan]今天看群里在讨论数据库死锁的问题,也一起研究了下,查了些资料在这里总结下. 所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将 ...