当前位置: 首页 > news >正文

腾讯企点app优化关键词排名外包

腾讯企点app,优化关键词排名外包,wordpress 500 阿里云,云南省建设执业注册管理中心网站文章目录 最小堆、最大堆最小堆(Min-Heap)最大堆(Max-Heap)堆的主要操作及时间复杂度堆的常见应用堆的数组表示大根堆--堆排序 最小堆、最大堆 最小堆(Min-Heap)和最大堆(Max-Heap)…

文章目录

      • 最小堆、最大堆
      • 最小堆(Min-Heap)
      • 最大堆(Max-Heap)
      • 堆的主要操作及时间复杂度
      • 堆的常见应用
      • 堆的数组表示
      • 大根堆--堆排序

最小堆、最大堆

最小堆(Min-Heap)和最大堆(Max-Heap) 是堆(Heap)数据结构的两种类型,它们都是完全二叉树,并且满足特定的堆性质。堆是一种优先级队列实现,通常用于高效地找出最值(最大或最小值)。堆的每个父节点都和其子节点满足一定的关系。

最小堆(又称:小根堆,小顶堆)
最大堆(又称:大根堆,大顶堆)

最小堆(Min-Heap)

最小堆1/ \2   3/ \   \5   6   4
  • 定义:在最小堆中,父节点的值总是小于或等于其子节点的值。
  • 性质:堆顶(根节点)的元素是整个堆中最小的元素。
  • 结构:因为是完全二叉树,每次插入或删除时,堆结构会通过比较节点来维持堆性质。

插入和删除的规则

  1. 插入:将新元素放在堆的末尾,然后通过“向上调整”(上浮)来恢复堆的性质,即与父节点比较,如果新元素小于父节点,就交换位置,直到符合堆的性质。
  2. 删除最小元素:将堆顶元素(最小值)移除,然后将最后一个元素移到堆顶,再通过“向下调整”(下沉)将其与子节点比较,直到恢复堆的性质。

最大堆(Max-Heap)

最大堆6/ \5   4/ \   \1   2   3
  • 定义:在最大堆中,父节点的值总是大于或等于其子节点的值。
  • 性质:堆顶(根节点)的元素是整个堆中最大的元素。
  • 结构:同样是完全二叉树,插入和删除操作遵循与最小堆类似的方式,只是比较方向相反。

插入和删除的规则

  1. 插入:将新元素放在堆的末尾,然后通过“向上调整”(上浮)来恢复堆的性质,即与父节点比较,如果新元素大于父节点,就交换位置,直到符合堆的性质。
  2. 删除最大元素:将堆顶元素(最大值)移除,然后将最后一个元素移到堆顶,再通过“向下调整”(下沉)将其与子节点比较,直到恢复堆的性质。

堆的主要操作及时间复杂度

  • 插入元素O(log n),因为插入后可能需要调整堆的性质,最坏情况下需要从新元素的位置一直调整到根节点,最多经过堆的高度,即 log n 次比较和交换。
  • 删除堆顶元素(最值)O(log n),删除堆顶元素后需要调整堆的性质,类似插入操作,最多需要 log n 次比较和交换。
  • 获取堆顶元素(最值)O(1),堆顶元素始终是最小堆的最小值或最大堆的最大值,直接读取即可。

堆的常见应用

  1. 优先队列:堆用于实现优先级队列,使得能够高效地获取优先级最高或最低的元素。
  2. 排序算法
    • 堆排序(Heap Sort):通过构建最大堆或最小堆来实现排序,堆排序的时间复杂度为 O(n log n),并且可以原地排序。
  3. 寻找前 k 大或前 k 小元素:可以使用大小为 k 的最小堆(用于前 k 大)或最大堆(用于前 k 小)来高效寻找前 k 个特定元素。
  4. 图算法
    • Dijkstra 算法:用于单源最短路径算法,堆能够高效地维护未访问节点的最短路径。
    • Prim 算法:用于生成最小生成树,同样需要使用堆来维护当前可访问的最小边。

堆的数组表示

堆可以使用数组来实现,这是由于堆的完全二叉树结构具备的特性使得它可以映射到一个一维数组中

节点索引规则

假设堆中某个节点位于数组的索引 i 处(i 是从 0 开始计数),那么:

  • 父节点索引:节点 i 的父节点位于索引 (i - 1) / 2(向下取整)。
  • 左子节点索引:节点 i 的左子节点位于索引 2 * i + 1
  • 右子节点索引:节点 i 的右子节点位于索引 2 * i + 2

大根堆–堆排序

public static void heapSort(int[] arr) {if (arr == null || arr.length <= 1) return;// 构建大顶堆for (int i = (arr.length - 1) / 2; i >= 0; i--) {heapify(arr, i, arr.length);}// 堆排序int len = arr.length;while (len > 1) {// 理解成删除堆中一个元素  删堆顶元素 然后将最后一个元素放到堆顶 然后重新调整堆swap(arr, 0, len - 1); // 将堆顶元素与最后一个元素交换len--; // 因为数组后面的元素已经排序完成heapify(arr, 0, len); // 调整堆}
}// 调整堆
private static void heapify(int[] arr, int i, int len) {while (true) {int maxPos = i; // 假设当前节点是最大值int leftChild = 2 * i + 1;int rightChild = 2 * i + 2;if (leftChild < len && arr[leftChild] > arr[maxPos]) {maxPos = leftChild; // 如果左子节点大于当前节点 更新最大值位置}if (rightChild < len && arr[rightChild] > arr[maxPos]) {maxPos = rightChild;}if (maxPos == i) break;swap(arr, i, maxPos);i = maxPos;}
}private static void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;
}

为什么从 (arr.length - 1) / 2 开始向上遍历?

假设堆中有 n 个元素,这些元素在数组中的索引是从 0n-1。完全二叉树的特性决定了:

  • 叶子节点不需要进行任何调整,因为它们没有子节点,不需要堆化。
  • 只有非叶子节点需要进行 heapify 操作,即调整节点的位置,使其符合大顶堆的性质。

用数组表示的完全二叉树中:

  • 叶子节点的索引:位于 n / 2n-1 之间。
  • 非叶子节点的索引:位于 0(n/2 - 1) 之间。

为什么要进行 heapify

heapify 是堆调整操作的核心,用来维护堆的性质。具体步骤如下:

  • 假设节点 i 的子树已经是堆,但节点 i 本身可能不满足堆的性质(例如,节点 i 比其子节点中的某一个值要小)。
  • 通过 heapify,我们将节点 i 与其子节点中较大的那个进行交换,然后递归地对交换后的位置继续进行调整,直到该子树成为一个合法的堆。

❤觉得有用的可以留个关注~❤

http://www.yayakq.cn/news/952807/

相关文章:

  • 多用户网站管理系统企业需求发布平台
  • 网站友情链接建设工商官网查询企业信息
  • 私人网站制作怎么做网站更新和维护
  • asp代码如何修改asp网站网页域名名称1元做网站方案
  • 网站副标题wordpress做网站前怎么建立数据结构
  • 淮安网站建设要多少钱微官网入口
  • 谁能给我一个网站做网站 设计师很
  • 广州品牌设计公司苏州seo服务
  • 无为县住房建设局网站深圳小程序建设公司
  • 推广网站怎样阻止建湖人才网招工
  • 网站安装dw网页制作模板下载
  • 给别人做软件的网站wordpress搭建好后如何在前台显示
  • 做二手房网站邯郸市建设局网站材料下载入口
  • 深圳外贸建站与推广成都到西安高铁多少钱
  • 电影网站怎么做的有什么公司建网站
  • 在线咨询 1 网站宣传销售管理系统数据流图
  • 网站建设的经验做法网站的展现形式
  • 虚拟货币网站建设绿化信息网站建设
  • 网站页面关键词都一样网站地图怎么设置
  • 北京商业设计网站wordpress evolution
  • 象山企业门户网站建设html5做网站导航
  • 自动发货网站建设网站首页确认书
  • 百度云加速 网站关键词微网站开发技术架构
  • 怎么用织梦做网站后台wordpress 用户评论
  • 网站ip域名查询access数据库网站开发
  • 交易所网站建设教程wordpress feed源
  • 外贸 企业网站 建设企业建网站一般要多少钱
  • 广东省农业农村厅网站三星网上商城发货速度
  • 自己如何免费做网站广西建设厅考试网站首页
  • 国内优秀网页网站新沂徐州网站开发