数据结构
一、介绍
数据结构就是计算机存储、组织数据的方式。主要大致包括:
- 线性结构:线性表(数组、链表、栈、队列、哈希表)
- 树:二叉树(AVL树、红黑树、B树、堆、Trie、哈夫曼树、并查集)
- 图形结构:邻接矩阵、邻接表
二、线性表
线性表是具有n个相同类型元素的有限序列(n>=0)
- 数组:数组是一种顺序存储的线性表,所有元素的内存地址都是连续的。数组无法动态修改容量,即创建了长度为3的数组,无法改动。开辟、销毁内存的次数相对少,但是可能造成内存的浪费。
- 链表:链表是一种链式存储的线性表,所有元素的内存地址不一定是连续的。开辟、销毁内存的次数相对多,但是不会造成内存的浪费。
- 栈:栈是一种特殊的线性表,一般只能在一端进行操作。 遵循先进后出的原则
- 队列:队列是一种特殊的线性表,一般只能在一端进行操作。 。遵循先进先出的原则
三、线性表选择
动态数组(ArrayList)和双向链表(LinkedList)
- 如果频繁在尾部添加、删除数据操作,动态数组和双向链表均可
- 如果频繁在头部添加、删除数据操作,选择双向链表
- 如果频繁在任意位置添加、删除数据,建议选择双向链表(平均复杂度O(N/2)),数组的平均复杂度为(O(n))
四、树
树的节点有:根节点、父节点、子节点、兄弟节点的概念。
树有子树、左子树、右子树区分,即节点下的节点的树形结构为子树。
一棵树如果没有任何节点称为空树,只有一个节点称为根节点。
- 节点的度:子树的个数
- 树的度:所有节点的度中的最大值。
- 叶子节点:度为0的节点
- 树的层数:根节点在第一层,根节点的子节点在第二层,以此类推。
- 节点的深度:从根节点到当前节点的唯一路径(经历的节点数包括自身)
- 节点的高度:从当前节点到最远叶子节点的路径上的节点总数
五、奇素数
31是一个奇素数,JVM会将31*i 优化成(i << 5) - i 通过位运算计算值
取模公式X % 2^ n = X & (2^ n – 1)