实现最小堆类

Posted 沿着路走到底

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现最小堆类相关的知识,希望对你有一定的参考价值。

在类里,声明一个数组,用来装元素。

主要方法:插入、删除堆项、获取堆项、获取堆大小。

插入

将值插入堆的底部,即数组的尾部。

然后上移:将这个值和它的父节点进行交换,直到父节点小于等于这个插入的值。

大小为 K 的堆中插入元素的时间复杂度为 O(logK)。

删除堆顶

用数组尾部元素替换堆顶(直接删除堆顶会破坏堆结构)。

然后下移:将新堆顶和它的子节点进行交换,直到子节点大于等于这个新堆项。

大小为 K 的 堆中删除堆顶的时间复杂度为 O(logK)。

获取堆顶和堆的大小

获取堆顶:返回数组的头部。

获取堆的大小:返回数组的长度。

class MinHeap 
  constructor() 
    this.heap = []
  

  swap(parentIndex, childIndex) 
    const temp = this.heap[parentIndex]
    this.heap[parentIndex] = this.heap[childIndex]
    this.heap[childIndex] = temp
  

  getParentIndex(index) 
    //return Math.floor((index - 1) / 2)
    return (i - 1) >> 1
  

  getLeftIndex(index) 
    return index * 2 + 1
  

  getRightIndex(index) 
    return index * 2 + 2
  

  shiftUp(index) 
    if (index === 0) return

    const parentIndex = this.getParentIndex(index)
    if(this.heap[parentIndex] > this.heap[index]) 
      this.swap(parentIndex, index)
      this.shiftUp(parentIndex)
    
  

  shiftDown(index) 
    const leftIndex = this.getLeftIndex(index)
    const rightIndex = this.getRightIndex(index)

    if(this.heap[index] > this.heap[leftIndex]) 
      this.swap(index, leftIndex)
      this.shiftDown(leftIndex)
    

    if(this.heap[index] > this.heap[rightIndex]) 
      this.swap(index, rightIndex)
      this.shiftDown(rightIndex)
    
  

  insert (value) 
    this.heap.push(value)
    this.shiftUp(this.heap.length - 1)
  

  pop () 
    this.heap[0] = this.heap.pop()
    this.shiftDown(0)
  

  peek() 
    return this.heap[0]
  

  size() 
    return this.heap.length
  
  

1

以上是关于实现最小堆类的主要内容,如果未能解决你的问题,请参考以下文章

8.7贪心策略例题:字典序最小问题

Java对象匹配以及权重筛选的设计和实现

华为机试真题 Python 实现最小调整顺序次数2022.11 Q4新题

华为OD机试真题 JavaScript 实现最小调整顺序次数2023 Q1 | 100分

华为OD机试真题 JavaScript 实现最小调整顺序次数2023 Q1 | 100分

nodejs实现冒泡排序和快速排序