「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战」
前言
算法与数据结构是我一直非常垃圾的一个点,作为一个 div 开发工程师,平时用到的又很少。但是想往高处走,算法、数据结构绝对是必不可少的。那么,耐下心从头把这块学习一遍,是非常重要的!
那么接下来就先来认识一下:什么是数据结构?
什么是数据结构?
-
简而言之:数据结构就是在计算机中,存储和组织数据的方式
-
但是计算机中数据量如此庞大,如何以高效的方式组织和存储呢?
-
就好比一个庞大的图书馆中存放大量书籍,不仅仅需要放入书籍,还需要在合适的时候将其取出
那么图书的摆放就需要考虑两个因素:
1、新书怎么插入?
2、怎么快速找到某本指定的书
合理方法:
方法一: 根据字母顺序来进行摆放、搜索
方法二: 根据类别划分书架区域,再根据字母顺序来排序
结论:
1、解决问题方法的效率,与数据的组织方式相关;
2、而计算机中的数据量远大于图书馆的书籍数量,那么如何来组织、存储数据,就是数据结构需要考虑的问题
什么是算法?
算法(Algorithm)的定义
-
一个有限指令集,每条指令的描述不依赖于语言
-
接受一些输入(某些情况下不需要输入)
-
产生输出
-
一定在有限步骤后停止
通俗释义
-
Algorithm 这个单词本意就是解决问题的办法、步骤逻辑
-
数据结构的实现,离不开算法
生活中的数据结构
1、上文提到的图书摆放
2、收快递。在存放快递的驿站、超市,他们会把所有快递放到一个固定位置,然后通过名字、编号对快递进行摆放。在有学生来取快递时,根据他的性命和编号快速找到对应的快递
生活中的算法
- 假如在上海、杭州之间有一条高架线,长度为100000m,有一天其中1m出了故障。如何快速定位到问题点呢?
二分查找:从中间开始排查,看问题是出在上海和中间之间,还是杭州和中间之间。然后再在一半的位置进行划分,快速锁定故障点。需要次数为 log2 (100000),以2为底,100000的对数,大概是 20次
数组结构
1、JS 的数组就是调用 API
2、其他语言的数组封装(例如 java 的 ArrayList)
-
常见语言的数组不能存放不同的数据类型,因此所有封装时通常存放在数组中的都是 Object 类型
-
常见语言的数组并不会和 JS 一样自动改变,需要进行扩容
-
常见语言的数组进行 中间插入 和 删除操作 的性能较低
数组是一种线性结构,并且可以在数组的任意位置插入或者删除
但是有时候,为了实现一些功能,必须对这种 任意性 进行限制
而 栈和队列 就是比较常见的 受限的线性结构
栈结构
一种受限的线性表,后进先出
-
只允许在表的一端进行插入和删除,也就是栈顶。另一端称为栈底
-
插入新元素又称为 进栈、入栈或者压栈
-
删除元素又称为出栈或者退栈
程序中的栈
- 函数调用栈:A调用B,B调用C,C中调用D
1、在执行过程中,会先将A压入栈,A因为没有之行为,就不会弹出栈
2、在A执行过程中调用了B,就会把B压入栈,这时B在栈顶,A在栈底
3、B又调用了C,把C压入栈...
4、C调用D,把D压入栈。此时A在栈底,D在栈顶
5、D执行完,首先弹出,然后依次执行C、B、A,依次弹出C、B、A
6、因此,函数调用栈 就是来自于这个实现机制(通过栈来实现的)