数据结构与算法的关系?
- 可以容纳数据的结构被称为数据结构(装数据的),关注的是数据的逻辑、存储等(可以理解为是静态的)
- 算法是用来对数据结构进行处理的方法;(可以理解为是动态的,操作型的)
线性数据结构(一维数据结构)之数组
- 简介: 线性的数据结构强调的事存储与顺序;简单的就是数组与链表;
- 数组:
- 数组的底层是数组定长;当数组长度达到了设定的长度,js引擎会自动扩容;但是,js引擎自动扩容的时候,会消耗CPU,损耗性能;
- 数组扩容方式:扩容不是在数组后面继续扩容;而是在新的空间,把之前的数组复制下来,然后多扩容相同长度的数组。
- 扩容:长度为5的数组,js引擎会扩容成长度为10的数组,然后把原来的数组的内容按照顺序复制下来,新扩容的内容从第六位开始依次添加(内存的分配都是操作系统的分配);
- 优化:定义时就定义好大概的数组长度,尽量减少js引擎自动扩容的发生;
- 数组的特性:(数组的优缺点都基于该特性)
- 存储在物理空间上是连续的;
- 底层的数组长度是不可变的;(js语言会扩容)
- 数组的变量指向的是数组第一个元素的位置;
let a = [1,2,3,4,5,6]a[1],a[2],a[3];<!--这个中括号表示存储地址的偏移;在操作系统中,通过偏移查询数据,性能最好-->
- 优点:
- 缺点:
- 因为空间必须得是连续的,所以如果数组比较大;当系统的空间碎片较多的时候,容易存不下
- 因为数组的长度是固定的,所以数组的内容难以被添加或删除;当数组删除某一个偏移位置的内容的时候,该位置后面的内容往前移
var arr = new Array(10);<!--参数10就是定义该数组长度为10;这种方式性能较好-->
线性数据结构(一维数据结构)之链表(大多数使用的是单链表)
- 链表的特性:
在空间上不是连续的;
每存放一个值,都要多开销一个引用空间
传递链表,必须传递链表的根节点,每一个节点都认为自己是根节点,因为每一个节点都只知道自己指向谁,不知道谁指向了自己(重要)
需要删除某个节点的时候,只需要断开该节点的上一个节点的指向,把上一个节点的指向改为下一个节点即可
2. 链表的优点:
只要内存足够大,就能够存的下,不用担心空间碎片的问题
链表的添加和删除非常的容易;
3. 缺点:
查询速度慢(查询某个位置);
链表每一个节点都需要创建一个指向next的引用,浪费一些空间;当节点内数据越多的时候,这部分多开销的内存影响越少;
4. 每一个节点都包括两个部分:
1. 本事的变量数据
2. 下一个节点的引用
5. 链表的创建:function Node(value){this.value = value;this.next = null}var a = new Node(1);var b = new Node(2);var c = new Node(3);var d = new Node(4);a.next = b;b.next = c;c.next = d;d.next = null;console.log(a.value);console.log(a.next.value);console.log(a.next.next.value);console.log(a.nent.next.next.value);<!--这种就是链表的基础写法:输出结果为1,2,3,4 -->