数据结构总结(java)

基础数据结构

数组
  • 优点
    • 构建非常简单
    • 能在 O(1) 的时间里根据数组的下标(index)查询某个元素
  • 缺点
    • 构建时必须分配一段连续的空间
    • 查询某个元素是否存在时需要遍历整个数组,耗费 O(n) 的时间(其中,n 是元素的个数)
    • 删除和添加某个元素时,同样需要耗费 O(n) 的时间
链表
  • 优点
    • 链表能灵活地分配内存空间
    • 能在O(1)时间内删除或者添加元素,前提是该元素的前一个元素已知,当然也取决于是单链表还是双链表,在双链表中,如果已知该元素的后一个元素,同样可以在 O(1) 时间内删除或者添加该元素。
  • 缺点
    • 不像数组能通过下标迅速读取元素,每次都要从链表头开始一个一个读取
    • 查询第 k 个元素需要 O(k) 时间
数组与链表
对比项数组链表
内存地址连续的内存空间非连续的内存空间
数据长度长度固定,一般不可动态扩展长度可动态扩展
增删效率低(O(n)),需要移动被修改元素之后的所有元素高(O(1)),只需要修改指针指向
查询效率高(O(1)),可通过数组名和下标直接访问低(O(n)),只能通过遍历节点查询
数据访问方式随机访问顺序访问

其他数据结构

跳表
  • 链表虽然通过增加指针域提升了自由度,但是却导致数据的查询效率恶化。特别是当链表长度很长的时候,对数据的查询还得从头依次查询,这样的效率会更低。跳表的产生就是为了解决链表过长的问题,通过增加链表的多级索引来加快原始链表的查询效率。这样的方式可以让查询的时间复杂度从O(n)提升至O(logn)。
  • 跳表通过增加的多级索引能够实现高效的动态插入和删除,其效率和红黑树和平衡二叉树不相上下。目前redis和levelDB都有用到跳表。
队列
  • 一种线性数据结构,可用数组也可用链表实现
  • 先进先出
  • 一种线性数据结构,可用数组也可用链表实现
  • 先进后出
  • 完全二叉树
    • 除了最后一层结点,其它层的结点数都达到了最大值;同时最后一层的结点都是按照从左到右依次排布。
  • 二叉排序树
    • 是一棵空树,或者:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉排序树。
  • 平衡二叉树
    • 平衡二叉树又被称为AVL树,它是一棵二叉排序树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
  • 红黑树
  • B树
  • B+树
对比项红黑树平衡二叉树
相同点都是二叉排序树都是二叉排序树
查找效率一般为O(logN),最坏情况差于AVL树O(logN)
插入效率需要旋转操作和变色操作,插入节点最多需要旋转2次,变色需要O(logN)插入节点最多需要1次旋转,O(logN)
删除效率删除一个结点最多需要3次旋转操作每一次删除操作最多需要O(logN)次旋转
优劣势数据读取效率低于AVL,维护性强于AVL数据读取效率高,维护性较差
应用场景搜索、插入、删除操作差不多搜索的次数远远大于插入和删除
  • 堆通常是一个可以被看做一棵树的数组对象。堆的具体实现一般不通过指针域,而是通过构建一个一维数组与二叉树的父子结点进行对应,因此堆总是一颗完全二叉树。
  • 对于任意一个父节点的序号n来说(这里n从0算),它的子节点的序号一定是2n+1,2n+2,因此可以直接用数组来表示一个堆。
  • 堆还有一个性质:堆中某个节点的值总是不大于或不小于其父节点的值。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。
散列表
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值