《我的第一本算法书》随手记(1)
!!!看了几本图灵系列的漫画书,随手记些要点,方便回忆!!!
第一章 数据结构
1. 什么是数据结构
数据存储于内存中,决定了数据顺序和位置关系的便是“数据结构”。
2. 链表
-
结构
链表由若干各节点组成,每个节点包含两部分:数据和指针,如下Blue、Yellow、Red代表节点的数据,指针指向下一个节点的内存地址(单向链表)。
链表中节点一般都是分散存储于内存中的,无须存储在连续空间中。
-
操作
因为节点分散的存储在内存中,所以如果想要访问节点数据,需要从链表头节点开始,顺着指针一一往下访问。如访问Red节点。
向链表中添加节点,只需修改添加位置前后节点的指针指向即可。如添加Green节点。
删除节点也一样,只需修改前后指针的指向即可。如删除Yellow节点。
-
常用链表
上面说的是单向链表,除了单向链表还有循环链表、双向链表等链表结构。
循环链表也叫环形链表,让链表尾部的节点指针指向头节点。想要保存数量固定的最新数据时通常使用这种链表。
双向链表的分割节点有两个指针,分别指向下一个节点和上一个节点,这种链表不仅可以从前往后,也可以从后往前遍历数据。
双向链表相对于单向链表有两个缺点:一是指针数的增加会导致存储空间的增加,二是添加和删除数据时需要改变更多的指针。
-
时间复杂度
查找:O(n), 添加删除:O(1)。
在链表中添加删除数据比较方便,查找数据比较耗时。
3. 数组
-
结构
数组有若干和数据组成,如下。a可认为为数组起始地址。
数组中的数据按顺序存在在内存的连续空间内。
-
操作
由于数据在内存中是连续的,所以每个元素的地址可以通过数组起始地址和数据下标算出,即可直接访问目标数据(随机访问)。
向数组中添加数据,要把已有数据一个一个移开,如把Green加到第二个位置,需要将Red、Yellow向后移一个。(确保尾部有足够的存储空间)
从数组中删除数据,首先移除目标数据,然后将后面的数据一个一个向前移。
-
时间复杂度
访问:O(1), 添加删除:O(n)
数组访问目标数据比较方便,添加删除数据比较耗时。
-
数组与链表比较
4. 栈
-
结构
栈也是一种数据呈线性排列的数据结构,不过在这种结构中,我们只能访问最新添加的数据。
-
操作
向栈中添加数据,数据放在最上面。
从栈中取出数据时,从最上面,也就是最新的数据开始取出。
-
说明
栈是一种后进先出的结构,称为LIFO。
应用:括号匹配