堆数据结构实现— Swift 4

动机

这篇文章旨在帮助您了解堆数据结构并在Swift中实现它。 在进入实现部分之前,必须先具备swift和heap知识。

什么是堆

堆是一种完整的二叉树的特殊类型,它的父节点与其子节点进行比较,从而为您提供数据结构中的最大值或最小值。

通常有两种类型。

  1. 最大堆:在最大堆中,父节点将始终大于其子节点。 所有其他节点可以按任何顺序排列
  2. 最小堆:在最小堆中,父节点将始终小于其子节点。 所有其他节点可以按任何顺序排列

注意: 当您只关心最小值或最大值时,堆数据结构很有用。 所有其他值将是无序且无排序的。

优先级队列是可以使用堆数据结构的典型示例。

实作

现在,我们将实现具有所有功能的最小堆。 实现需要执行以下步骤:

1.向堆添加值

2.从堆中删除最少的元素

3.从堆中获取最少的元素

我们开工吧。

创建堆类

堆可以用数组表示。 一个父节点可以有一个左子节点和一个右子节点。 我们可以通过以下方式获取正确的Child的索引和离开的孩子的索引

左儿童索引= 2 *父索引+1

右子索引= 2 *父索引+2

用同样的方式
ParentIndex =(childIndex-1)/ 2

在堆类中实现所需的方法

将这些方法添加到堆类中。

现在,我们将添加在Heap上执行自定义操作的方法。

添加这些方法

peek()返回堆中的最小元素

poll()与peek一样,但是它也删除了最小元素

add()将元素添加到堆中

removeMin()删除堆中的最小元素

现在您一定在想,什么是heapifyDown()和heapifyUp()

让我们实现它们

堆砌

这是在将元素添加到列表之后发生的过程。 因此,如果要在堆中添加元素,只需将其添加到最后一个元素,然后开始与父元素进行比较,直到堆满足条件为止

HeapifyDown

当您删除列表中的最小元素并且堆必须重新排列自身以满足条件时,就会发生此过程。 对于父节点,它将检查子节点是否小于父节点(如果是),然后交换该值。 它一直持续到堆满足其先决条件为止。

让我们添加printMethod来打印堆

让我们使用这些方法来处理堆。

如您所见,我们以随机方式在堆中添加了元素。 但是,在任何时候打印堆时,它总是先打印最小值。

查看移除时的运作方式

这就是您可以对堆执行的所有基本操作。 您可以在堆的帮助下实现优先级队列。 我鼓励您实施它,因为它很有趣。

结论

就是这个帖子。 我们已经了解了Swift中堆实现的基础知识。 您可以使用它做更多的事情,例如优先级队列。