数据结构与算法-4

1.堆

相关示例代码(堆/堆排序/时间复杂度计算…)

  1. 完全二叉树:
  • 数组表示时,使用下标为0的位置时,左孩子的下标 2*i + 1,右孩子 2*i + 2, 父节点 (i-1)/2, i为节点所在层数

  • 数组表示,不适用下标为0的位置时,lchild: 2*i , rchild: 2*i+1, 父节点: i/2,此时可以用位运算代替*/运算

  • 用数组表示时,可以规定完全二叉树的最大节点数size,那么在数组 [0,size-1] 的下标范围,都为该完全二叉树的节点范围

  1. 最大堆/大根堆:
    任何一个子树的最大的节点都为该子树的头节点
  1. 最小堆/小根堆:
    任何一个子树的最小的节点都为该子树的头节点
  1. 堆排序:
  • 先让整个数组变成最大堆,建堆的过程:从上到下-> O(N*logN) ; 从下到上-> O(N)
  • 把堆的最大值和末尾值交换,然后减少堆的大小之后再去调整堆,重复此过程直至完成所有值的调整,时间复杂度O(N*logN)
  1. java中的PriorityQueue就是用堆实现的,默认使用最小堆,可以传入比较器修改
    当传入复杂数据时,如果修改了数据的某属性需要重新排序,java的PriorityQueue是不支持的,所以需要重新实现该结构,在堆结构中实现resign方法实现重排序,实现代码参见 相关示例代码 中的ComparatorHeap类的实现

2.堆相关习题

  1. 已知一个几乎有序的数组,几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离一定不超过k,并且k相对于数组长度来说是比较小的。请选择一个合适的排序策略,对这个数组进行排序。
  • 使用小根堆,堆的大小为k + 1,先向heap中添加值保证heap大小为k+1,然后弹出最小值,重复此过程直到arr中已没有数据可以向heap中添加时,依次弹出堆中剩下的数据即可,时间复杂度 O(N * logk)
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值