数据结构与算法 之 一维数据结构
一、数据结构与算法有什么关系?
数据结构:可以容纳数据的结构被称为数据结构。
算法:用来对数据结构进行处理的方法被称为算法。
我们可以认为,数据结构是静态的,算法是动态的。
二、一维数据结构(线性数据结构)
一维数据结构主要有数据和链表。主要强调存储与顺序。
1.数组
数组:
数组的特性:
- 在物理空间上的存储是连续的。
- 底层的数组长度是不可变的。
- 数组的变量,指向了数组第一个元素的位置。
数组的优点:
- 查询性能好, 需要随机的读取元素时,数组的效率很高,因为可以迅速找到数组的任何元素。
在操作系统中,通过偏移查询数据的性能最好
数组的缺点:
- 因为空间必须是连续的,所以如果数组比较大且系统的空间碎片比较多的情况下,容易存不下。
- 因为数组的长度是固定的,所以数组内容难以被添加和删除(如果想添加数组元素,需要开辟新的内存空间)
创建数组:
const arr = new Array(5).fill(0)
// [0,0,0,0,0]
const nums = [1,2,3,4,5];
// [1,2,3,4,5]
2.链表
链表:链式存储结构,链表中的元素可以存储在内存的任何地方,链表中的每个元素都存储了下一个元素的地址,从而使一些列随机的内存地址串在一起。
链表的特性:
- 在空间上是不连续的。
- 每存放一个值,都需要多开销一个引用空间。
优点:
- 不需要连续的内存空间,只要内存足够大,不需要担心存不下的情况。
- 链表的添加和删除非常容易:只需将其放入内存,并将其地址存放到前一个元素中即可。
缺点:
- 查询速度很慢,需要从根节点开始挨个向后查询。
- 链表的每一个节点都需要创建一个指向next的引用,浪费一些空间。
创建链表:
function Node(value){
this.value = value;
this.next = null;
}
const a = new Node('a');
const b = new Node('b');
const c = new Node('c');
a.next = b;
b.next = c;
循环链表:
function loop(root){
const temp = root;
while(temp){
console.log(temp.value);
temp = temp.next;
}
}
总结
链表和数组各有其优势和适用场景。链表适合频繁插入和删除的操作、动态分配内存和按顺序查找的数据的情况;而数组适合静态数据结构,数据密集和需要快速查找数据的情况。在选择时应该根据具体的应用场景和需求来权衡合适的数据结构。