常用数据结构及其应用场景

目录

1,数组

2,链表

3,树

3.1 二叉搜索树

3.2 AVL树

3.3红黑树

补充:关于AVL树和红黑树的左旋与右旋

右旋

左旋


思维导图

1,数组

这是大家最熟悉的数据结构了;

数组的优势:

  1. 随机访问(按下标访问):时间复杂度O(1)
  2. 正常查找一个元素,时间复杂度O(n)
  3. 如果数组是有序的,升序或者降序,使用二分查找,时间复杂度O(logN),N为数组长度

劣势:

  1. 除去首部和尾部,在中间插入或者删除元素,都要导致大量数据的移动

使用场景:

常查询,少插入或者删除的情况

2,链表

链表的优势:

  1. 查询时间复杂度:时间复杂度O(N),N为链表长度
  2. 插入或者删除不需要移动大量的元素,因为链表本身就是非连续的存储

劣势:

  1. 查询,删除,在给定位置插入元素的时间复杂度都是O(N)这点一直被人诟病
  2. 后续提出的双向链表,只是提高的删除结点的时间复杂度,其余都一样,直到跳表的出现,降低了链表查询的时间复杂度

使用场景:

多插入或者删除,少查询的情况

对CPU来说,数据更友好一些,因为CPU从内存中读取内容,假设数组是int类型,并不是每次都读取一个数字,4KB,而是读取一个数据块,放入到CPU缓存(cache)中,下次想从CPU的缓存中找,CPU缓存比内存的读写要快,所以对于连续存储的数据来说,连续访问或者遍历时,对CPU是较为友好的。

3,树

从计算机行业的发展可以看出,基本是朝着更快更高并发更便宜的方向狂奔不止的,并发数量要求高,响应速度要求也高,数据量极大,那么像数组,链表这种数据结构,在大数据量面前,基本丧失了所有该有的优势功能。

3.1 二叉搜索树

树很好的解决了这些问题,尤其是 二叉查找/搜索(sort)树

二叉查找树有如下的性质:

  1. 左子树不为空,则左子树上所有结点的值均小于它的根结点的值
  2. 右子树不为空,所有右子树上所有结点的值均大于根结点的值
  3. 根结点的左右子树也是一颗二叉排序树。

看上去就完美的设定,查找时间复杂度O(logN)(log以2为底N的对数,其中N是树的深度)

但是当我们输入一串有顺序的数组后,二叉查找树就会完全退化为一个链表,查找时间复杂度O(N)

3.2 AVL树

为了解决这个问题,现在规定每个结点的左孩子结点都小于该结点,右孩子结点都大于根结点,且左右子树的高度差不大于1

但是平衡二叉树有个致命的问题:

那么为了解决这个问题,提出了AVL数,即完全平衡二叉树,每次插入一个结点,都需要使用左旋、右旋、左旋与右旋的组合来维持平衡,即每个结点的左孩子结点小于根结点,根结点小于右孩子结点,且左右子树的高度差不大于1,为了达到完全平衡,AVL树付出了太多的代价。效率不高。

为了解决这个效率问题和二叉查找树退化链表的问题,提出了红黑树

3.3红黑树

红黑树有以下特点:

  1. 每个结点不是红色就是黑色
  2. 红色结点不可能有连在一起的
  3. 结点都是黑色:入度为0
  4. 每个红色结点的连接子结点都是黑色
  5. 叶子结点都是黑色(NULL):出度为0
  6. 每个结点,从该结点到达其可达叶子结点的所有路径,都包含相同数目的黑色结点

如果说完全平衡二叉树是通过左旋,右旋,左旋和右旋的组合,保证每个结点的左孩子都小于根结点,右孩子都大于根结点,且左右子树的高度差不大于1

那么红黑树就是通过变色,左旋,右旋,左旋和右旋的组合,保证结点之间红黑间隔,每个结点到叶子结点经过的黑色结点个数都是一样的,以此来保持平衡

红黑树处理插入结点的规则:

插入的点默认是红色

变颜色情况:

当前结点的父亲结点是红色,且叔叔结点也是红色,红色结点不能相连,那么使用变色进行处理:

  1. 把父亲结点变为黑色
  2. 把叔叔结点变为黑色
  3. 把祖父变成红色

把指针定义到祖父结点,查看是否符合红黑树的定义,不符合则进行变色或者左旋或右旋

补充:关于AVL树和红黑树的左旋与右旋

(来自大话数据结构)

右旋

左旋

常用数据结构及其应用场景相关推荐

  1. redis专题:redis的常用数据结构及使用场景

    文章目录 一. redis常用五大数据结构 〇:key的底层存储方式:SDS ①:string && 使用场景 ②:hash && 使用场景 ③:list && ...

  2. php两个数组之间去重,php数组去重、魔术方法、redis常用数据结构及应用场景

    一.用函数对数组进行去重的方法 1. arrau_unique函数的作用 移除数组中重复的值. 将值作为字符串进行排序,然后保留 每个值第一次 出现的健名,健名保留不变. 第二个参数可以选择排序方式: ...

  3. java中数据结构的应用_Java集合入门 (二)常用数据结构和应用场景-数组

    Java极客  |  作者  /  铿然一叶 这是Java极客的第 48 篇原创文章 一.数组的特点 1.数组大小固定 2.一个数组只能存储相同数据类型 3.随机访问性能高 4.存储空间连续,这样可以 ...

  4. 各种数据结构及其应用场景

    1. 常用数据结构及其应用场景: https://www.jianshu.com/p/ec17d738327f 2. 代码可执行文件的内存占用:[https://blog.csdn.net/u0129 ...

  5. iOS标准库中常用数据结构和算法之内存池

    上一篇:iOS标准库中常用数据结构和算法之位串 ⛲️内存池 内存池提供了内存的复用和持久的存储功能.设想一个场景,当你分配了一块大内存并且填写了内容,但是你又不是经常去访问这块内存.这样的内存利用率将 ...

  6. 【Python基础】盘点 Python 10 大常用数据结构(上篇)

    我的施工之路 上图施工计划,已完成专题: 1我的施工计划 2数字专题 3字符串专题 4列表专题 5流程控制专题 6编程风格专题 7函数使用 8.面向对象编程(上篇) 9.面向对象编程(下篇) Pyth ...

  7. 【Python基础】盘点 Python 10 大常用数据结构(下篇)

    我的施工之路 虽然艰辛,却有读者们陪伴 Python 常用数据结构 此专题<盘点Python10大常用数据结构>目录: 学习目的 学习目标 1 list 2 tuple 3 set 4 d ...

  8. hashmap应用场景_Redis 5种数据结构 及使用场景分析

    也当过面试官,面试过不少应聘者,因为是我自己招人自己用,所以我不会看应聘者造火箭的技术有多牛比,只看拧螺丝的手艺瓷不瓷实.毕竟以后是一个整体,拖了大家后腿团队都很难受. 面试的题目一般也不会太难,就像 ...

  9. 常用的数据结构_三分钟了解区块链常用数据结构「默克尔树」

    免责声明:本文旨在传递更多市场信息,不构成任何投资建议.文章仅代表作者观点,不代表火星财经官方立场. 小编:记得关注哦 来源:万向区块链 原文标题:三分钟了解区块链常用数据结构「默克尔树」 默克尔树是 ...

最新文章

  1. 自定event事件之手动触发(一)
  2. python监控进程状态_python监控进程脚本
  3. C++ gets, getline ( string流)
  4. ProgressBar控件在Listview下的多线程应用(转自johngeng)
  5. 加权最小二乘法的原理讲解
  6. jsp中request.getAttributeNames()报红
  7. (转)shiro权限框架详解03-shiro介绍
  8. 经济机器是怎样运行的(文字版)-瑞.达利欧
  9. Windows CE 桌面UI修改
  10. Caused by: java.lang.ClassNotFoundException: org.jbpm.pvm.internal.processengine.SpringHelper
  11. Post Office
  12. ZFS case : top CPU 100%sy, when no free memory trigger it.
  13. Docker监控远程服务器
  14. 基础提升*哈希函数与哈希表
  15. 梯度下降法-学习率选取
  16. mysql安装后目录介绍,MySQL安装后的目录结构及配置文件详解
  17. 仁者乐山,智者乐水,吃货乐在北海道~
  18. OAuth2.0微信code获取失败怎么办
  19. 【链表】如何判断两个单向链表是否有相交,并找出交点
  20. 逻辑思维-03取水问题

热门文章

  1. 2020-11-23 PTA算法_贪心算法部分习题及代码
  2. CTF之路:git项目本地版本库(.git文件夹)漏洞利用
  3. 黑洞猝灭剂BHQ-2 acid,1214891-99-2,BHQ-2 Carboxylic Acid用作各种荧光共振能量转移,这种探针主要用于分析。
  4. [CryptoHack] RSA-PRIMES PART1 Write-Up
  5. 【物理应用】大气湍流相位屏仿真matlab源码
  6. 试论and连接并列主语时的主谓一致
  7. 新版Qq为什么不受欢迎?
  8. Deepin 15.11下载安装新版 QQ Linux
  9. html总微软雅黑怎么设置,css怎么设置字体为微软雅黑
  10. 外挂基础知识入门教学