《我的第一本算法书》学习记录
数据结构
什么是数据结构
数据结构用于描述数据的顺序和位置关系,数据存储于计算机的内存中。内存如图所示,形似排成1列的箱子,1个箱子里存储1个数据。数据存储于内存时,决定了数据顺序和位置关系的便是“数据结构”。
三种比较常见的存储格式:
- 全局无序随机排列(适合需要不断添加数据)
- 全局有序排列(不需要修改数据)
- 部分有序排列(两者合一)
链表
链表是数据结构之一,其中的数据呈线性排列。在链表中,数据的添加和删除都较为方便,就是访问比较耗费时间。
这就是链表的概念图。Blue、Yellow、Red这3个字符串作为数据被存储于链表中。每个数据都有1个“指针”,它指向下一个数据的内存地址。
在链表中,数据一般都是分散存储于内存中的,无须存储在连续空间内。但是读取时需要按顺序读取,比如需要读取“red”就需要先从“Blue”读起。
在链表中添加数据只需要改变对应的指针指向的位置,将需要添加数据的位置前后的指针指向改变即可。
同时删除只需要将对应数据存储的指针取消即可,不需要删除实际数据,在正常运行过程中,数据会被后续结果覆盖。
**复杂度:**把链表中的数据量记成 n n n。访问数据时,我们需要从链表头部开始查找(线性查找),如果目标数据在链表最后的话,需要的时间就是 O ( n ) O(n) O(n),添加数据或删除数据只需要该表指针位置,复杂度为 O ( 1 ) O(1) O(1)
如果在数据的结尾添加一个指针指向开始数据,就会构成循环列表,适用于固定数量的数据更新。
数组
数组也是数据呈线性排列的一种数据结构。与链表不同,在数组中,访问数据十分简单,而添加和删除数据比较耗工夫。
由于数据是存储在连续空间内的,所以每个数据的内存地址(在内存上的位置)都可以通过数组下标算出,我们也就可以借此直接访问目标数据(这叫作“随机访问”)。
复杂度: 假设数组中有n个数据,由于访问数据时使用的是随机访问(通过下标可计算出内存地址),所以需要的运行时间仅为恒定的 O ( 1 ) O(1) O(1)。向数组中添加新数据时,必须把目标位置后面的数据一个个移开。所以,如果在数组头部添加数据,就需要 O ( n ) O(n) O(n)的时间。
数组与列表的比较
访问 | 添加 | 删除 | |
---|---|---|---|
链表 | 慢 | 快 | 快 |
数组 | 快 | 慢 | 慢 |
栈
栈也是一种数据呈线性排列的数据结构,不过在这种结构中,我们只能访问最新添加的数据。栈就像是一摞书,拿到新书时我们会把它放在书堆的最上面,取书时也只能从最上面的新书开始取。
入栈:往栈中添加数据的操作叫“入栈”(Push)
出栈:从栈中取出数据的操作叫“出栈”(POP)