那些年我们学过的数据结构

数据结构我们在大学学过,现在高级语言基本都提供了实现的API,大部分时候我们只需使用即可,极少情况下需要自己实现,比如遇到性能问题,造轮子,发明新框架等,因此我们主要以了解其特点原理、优缺点、时间/空间复杂度、适用场景即可,理解其原理,平时使用时也更得心应手,出现问题时也方便分析排查。在此,仅仅索引学习到的算法名称,简单介绍优特征、优缺点、适用场景等,在内存无比廉价的今天,速度为王,我们以关注时间复杂度为主。如果想研究其具体实现,java.util.*下有大部分的实现。

链表

  • 单链表, 单向迭代
  • 双链表,双向迭代,java.util.LinkedList

向量

  • 动态扩展的内存数组, java.util.ArrayList

  • 后进先出,java.util.Stack

队列

  • 先进先出,java.util.LinkedList/ArrayDeque/PriorityQueue

哈希表

  • O(1)查找,解决冲突方式有拉链发、开放地址法,java.util.HashMap

跳跃表

  • SkipList, 特殊有序链表,在Node上建索引,增删改查O(logN),相比二叉平衡树,基本不需自平衡,在并发环境下加锁开销更小,java.util.Concurrent.ConcurrentSkipListMap

位图

  • 主要用于去重计数,java.util.BitSet

  • 二叉树,每个节点最多有左右两个子节点
  • 满二叉树,所有叶子结点必须在,节点数达到最大值
  • 完全二叉树,二叉树的深度为h,除第 h 层外,其它各层 (1~(h-1)层) 的结点数都达到,最大个数,第h层所有的结点都连续集中在最左边

注:完全二叉树是效率很高的数据结构,堆是一种完全二叉树或者近似完全二叉树,所以效率极高,像十分常用的排序算法、Dijkstra算法、Prim算法等都要用堆才能优化,二叉排序树的效率也要借助平衡性来提高,而平衡性基于完全二叉树。

  • 二叉查找树(BST),又称二叉排序树(Binary Sort Tree),或二叉搜索树, 左节点<根节点<右节点

  • 平衡二叉树(AVL),左右子树高度相差不超过1,以前在AllYes时见过C语义版本AVL

  • 红黑树, Red Black Tree,每个节点有个颜色,相比AVL,自平衡时旋转次数较少,实际应用中有序平衡树基本都是用的是RBT, java.util.TreeMap

  • B-树即B树,中间是横杆,非减号,有序平衡多路搜索树,减少树深度,减少了查找时间,常用于数据库和文件系统

  • B+树,B树变种,所有关键字都在叶子节点出现,叶子节点上存储是数据索引,非叶子节点只存储关键字,用于索引叶子节点,因此查找总会到达叶子节点,常用于文件系统索引

  • B*树,B+树变种,在B+树的非根和非叶子结点再增加指向兄弟的指针,将结点的最低利用率从1/2提高到2/3,B *树分配新结点概率比B+树低,空间利用率更高

  • Trie树,又称单词查找树、字典树,哈希树变种,典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。

  • 堆, 父节点总是大于左右子节点为大顶堆,父节点总是小于左右子节点为小顶堆,常用于求TopK,java.util.PriorityQueue

  • 2-3树,一种平衡树,每个节点存最多2个元素,因此最多会有3个子节点,2-3查找树实现起来比较复杂,在某些情况插入后的平衡操作可能会使得效率降低。在2-3查找树基础上改进的红黑树不仅具有较高的效率,并且实现起来较2-3查找树简单。

  • 哈希树

  • 树状数组

  • 伸展树

  • 线段树

  • 决策树,用于机器学习

  • 森林,多个非相交树

  • 无向图

  • 有向图, storm.jgraph jar有实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值