常用数据结构总结
数据结构 | 特性 | 备注 |
---|---|---|
数组 Array | 一维,多维数组;线性排列的数据 | 有序数组可以采用二分查找,提高效率 |
栈 Stack | 先进后出(FILO),后进先出(LIFO) | 在特定时刻只有一个数据项可以被读取或者被删除 |
队列 Queue | 先进先出(FIFO) | 在特定时刻只有一个数据项可以被读取或者被删除 |
单向链表 | 从一端开始遍历所有数据,适合单向存储场景,例如HashMap | 搜索的复杂度和无序数组差不多。但是插入和删除节点比无序数组快,因为链表不需要移动任何东西 |
双向链表 | 从两端开始遍历所有数据 适合双向存储场景,例如LinkedHashMap | 同单向链表 |
树 | 可以分出多个树枝,分出来的树枝还可以再分 | 既能像链表那样快速的插入和删除,又能像有序数组那样快速查找 |
二叉树 | 一个节点的左子节点的关键字值小于这个节点,右子节点的关键字值大于或等于这个节点;插入一个节点需要根据这个规则进行插入 | 同树 |
红黑树 | 1.节点都有颜色;2.在插入和删除的过程中,要遵循保持这些颜色的不同排列的规则。例如Java8的HashMap | 同树 |
小结:
- 数组:适合有读写,无序数组搜索效率不高,有序数组可以二分法搜索。但是插入和删除某个节点效率低
- 链表:很适合有插入和删除节点操作的场景。特别在复制时间远大于比较时间的情形,还能解决内存使用率问题。但是搜索效率低
- 红黑树:解决二叉树不平衡问题;既有链表的插入和删除的效率,又有”有序数组”查询的效率
PS:
强类型:存储数据元素类型必须在初始化时指定。这样在运行时,不需要耗费额外的时间来定义数组类型,能够大大提升运行效率
各个算法的效率,请参看这里数据结构和算法