3.数组和链表
数组和链表是计算机中最最基本的两个数据结构,是其他数据结构的基础。
一.数组
数组是一种线性表数据结构,它用一组连续的内存空间存储相同类型的数据,有以下三个特点:
- 线性表(类似数据结构还有链表、队列、栈,每个线性表上的数据最多只有向前和向后两个方向)
- 申请连续的内存空间和存储相同的数据类型
申请连续的内存空间意味着可以随机访问(arr[k]_address=base_address + k*type_size),所以数组的查询时间复杂度为O(1),
但同时也意味着对内存利用的苛刻,比如此时内存剩余空间有500M,但是剩余空间非连续,分别有200M和300M两个空闲区组成,此时
如果数组需要申请的空间为400M,则会报内存空间不足。
- 低效的插入和删除(为了在插入和删除元素后保持数组所在空间的连续性而需要移动元素,时间复杂度为O(n))
二.链表
链表是一种线性表数据结构,它通过“指针”将零散的内存块串联起来使用,这里主要讲的是单链表,有以下特点:
- 线性表
- 能利用零散的内存块(意味着能充分利用内存空间,但是每次查询时都是通过头结点遍历,所以查询时间复杂度为O(n))
- 高效的插入和删除(由于插入和删除只需改变节点指针的指向,所以时间复杂度为O(1)
下图是二者在内存中的区别: