1.数组
内存中连续存储,索引方便,但扩容和增删麻烦,并且只能存储同种类型数据
2.栈
只能在一端(栈顶)进行操作的线性表,栈的操作包括入栈,出栈和取栈顶元素。栈符合先进后出原则,主要应用于递归中。
3.队列
也是线性表,先进先出,在一端添加元素,在另一端取出元素,主要用于多线程阻塞列管理中。
4.链表
物理存储单元非连续,非顺序,其数据元素的逻辑顺序通过指针来实现。每个节点包括元素和指向下一个节点的指针,因此链表中含有大量指针占据空间。优点是增删快,缺点是查找不方便,适用于数据量小,且需要频繁增删操作的场景。
5.树
树可以看作是一种特殊的双向链表。树的度指树的宽度,即结点的分支数。树的深度指最大层数。
前序遍历:根-左-右 (针对子树也是如此) 中序遍历:左-根-右 后续遍历:左-右-根
性质:
高度为n的树至少有n+1个结点,最多有2^n - 1 个结点;
第n层最多有2^(n-1)个结点;
6.散列表(哈希表)
根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
记录的位置 = f(key)
其综合了数组和链表的特性,寻址容易,增删也方便。
最常用的一种方法——拉链法,我们可以理解为“链表的数组”。当存储记录时,通过散列函数计算出记录的散列地址;当查找记录时,我们通过同样的是散列函数计算记录的散列地址,并按此散列地址访问该记录。
优点:不论哈希表中有多少数据,查找、插入、删除(有时包括删除)只需要接近常量的时间即0(1)的时间级。实际上,这只需要几条机器指令。哈希表运算得非常快,在计算机程序中,如果需要在一秒种内查找上千条记录通常使用哈希表(例如拼写检查器)哈希表的速度明显比树快,树的操作通常需要O(N)的时间级。哈希表不仅速度快,编程实现也相对容易。如果不需要有序遍历数据,并且可以提前预测数据量的大小。那么哈希表在速度和易用性方面是无与伦比的。
缺点:它是基于数组的,数组创建后难于扩展,某些哈希表被基本填满时,性能下降得非常严重,所以程序员必须要清楚表中将要存储多少数据(或者准备好定期地把数据转移到更大的哈希表中,这是个费时的过程)。
7.堆
堆可以看作一棵树的数组对象:堆中某个结点的值不大于(小于)其父结点;堆总是一颗完全二叉树;
一般用于堆排序
8.图
两大元素:顶点和边
如果有一个问题可以通过顶点和边表示出来,那么就可以将问题用图画出来,然后使用著名的图算法(比如广度优先搜索或者深度优先搜索)来找到解决方案。
常用的存储方式有两种:邻接矩阵和邻接表。