• 首页
  • 栏目
  • CRM
  • 【jeecg-boot项目开发crm】:平台技术点——day05【Java定时任务解决方案:二、小顶堆(插入,删除元素)】:...

【jeecg-boot项目开发crm】:平台技术点——day05【Java定时任务解决方案:二、小顶堆(插入,删除元素)】:...

  • 2021-11-15
  • Admin

二、小顶堆

在这里插入图片描述

  • Timer和定时任务线程池用的都是基于小顶堆
  • 后面的quartz以及更高级的是基于时间轮算法

2.1 堆

在这里插入图片描述

  • 堆是一颗完全二叉树
    在这里插入图片描述
  • 完全二叉树:除了最后一层外,其他层都达到最大节点数,且最后一层节点都靠左排列。
    在这里插入图片描述
  • 小顶堆:最小值在上面
  • 大顶堆:最大值在上面
  • 要掌握:堆的,存,取
    • 存的话,java有两种:数组和列表【这里选用的数组的方式】

在这里插入图片描述

  • 堆插入数组的原则:从上到下,从左向右。
  • 查询不方便,所以数组下标0的位置不放数字。
  • 这样的好处是查询父节点方便,只需要用子节点的下标/2即可。
  • 注:每一个节点存的是一个Job,Job的值就包含了触发时间(所以越靠前触发时间越近)。

2.2 插入元素[插入尾部,然后上浮]

在这里插入图片描述

  • 记住一句话:插入尾部,然后上浮就可以了【上浮下沉还有个词叫:堆化】
  • 插入尾部:就避免了插到头部数组的整体移动问题
  • 然后上浮:和他的父节点比,如果小于父节点就替换。迭代向上走
    在这里插入图片描述
    在这里插入图片描述

2.3 删除堆顶元素[将尾部(最大的元素)元素放到堆顶,然后下沉]

  • 删除只能取堆顶元素

在这里插入图片描述

  • 记住这句话就行了:将尾部(最大的元素)元素放到堆顶,然后下沉【上浮下沉还有个词叫:堆化】
    在这里插入图片描述
  • 比如:将8放到根节点上之后(删除原来的)
  • 然后和比较小的子节点进行交换
  • 继续迭代上面的步骤

在这里插入图片描述

2.4 以上呢种就是核心下面是了解【建堆,堆排序,总结】

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

原文:https://blog.csdn.net/qq_40572023/article/details/121330612

联系站长

QQ:769220720