“一个”堆与“那个”堆有什么关系?

2025年2月6日 | 阅读7分钟

堆(数据结构)

“堆”通常指的是一种叫做堆(通常是基于树的结构)的数据结构。堆主要有两种类型:二叉堆和二项堆。

二叉堆

二叉堆是一种遵循堆属性的二叉树数据结构。它是优先队列的主要应用之一。

最大堆

在最大堆中,节点 i 不是根节点,并且 i 的值小于或等于其子节点的值。峰值元素位于根节点。

最小堆

在最小堆中,对于根节点以外的每个节点,i 的值等于或大于其子节点的值。所需的最大值位于最低级别。

What's the relationship between a heap and the heap

二项堆

二项堆是一种将较小的二项树组合成一个结构的数据结构。它当然与二叉堆互补,并将合并和减小键作为高效操作。二项堆在这些操作上比二叉堆具有更好的摊销时间复杂度。

代码实现

输出

What's the relationship between a heap and the heap

说明

  1. 堆类:实例变量:堆组件可以存储在数组中。
  2. 堆化上移(Heapifyup)技术:此方法用于确保在执行 push 操作后维持堆属性。它将新项目放入第一个位置,然后相互比较并交换,必要时进行交换,直到堆属性再次完整。
  3. 堆化下移(Heapifydown)策略:它有助于在执行 pop 操作后恢复堆属性。它以根组件为基础,然后将其与较大的子节点交换,直到恢复堆属性。
  4. push 技术:这种技术用于将元素插入堆中。它将元素添加到堆的末尾,然后调用 Heapifyup 来创建堆属性。
  5. pop 方法:该方法实现从堆中移除根(最大元素)。它首先使用最后一个元素替换根,然后调用 Heapifydown 以确保保留堆条件。
  6. print_heap 方法:此技术用于显示堆的各个元素。
  7. top 方法
    • 此技术从堆中提取最大(根)元素。
    • 初始堆(h)被设置为空。
    • 尝试在空堆上使用 pop() 会显示“堆下溢”消息。
    • 节点 5 和 7 被推送到队列中,然后打印根节点。
    • 另一对元素(6, 4)进入堆,然后显示更新后的堆。
    • 打印出堆的大小。
    • 执行 pop() 操作,然后打印 pop 之后的堆。
  8. 输出
    • 最后,打印出堆数据结构。
    • 该程序使用最大堆,其中根节点具有最大值。
    • push、pop、print_heap、size 和 top 等方法提供了与堆交互的功能。

最小堆

输出

What's the relationship between a heap and the heap

说明

  1. 类声明:确定一个名为 CustomHeap 的类。
  2. 实例变量:确定私有数组 heapArraY(用于存储堆组件)和 heapSize(用于跟踪堆的当前大小)。
  3. 构造函数:初始化 heapArray,大小固定,heapSize 设置为 -1。
  4. HeapifyUp 策略:一个私有方法,通过重新定位新添加的组件(向下)来执行排序的堆属性。
  5. HeapifyDown 技术:一个私有方法,特别地将根元素放到其正确的位置(降序位置)。
  6. Push 技术:公开策略之一是通过调用 heapifyUp 来在堆中添加一个新节点,该节点将满足堆属性。
  7. Pop 技术:创建一个公共函数 remove_root_element,并具有 heapifyDown 功能,以在作为其参数时恢复堆属性。
  8. PrintHeap 方法:一个公共方法,用于打印堆中的项目。
  9. Size 策略:公共技术,用于获取堆大小。
  10. Top 技术:一个公共方法,用于获取最大堆中顶层元素的值(最大堆中的最小值)。
  11. Swap 方法:一个私有实用函数,用于交换 heapArray 中位于相应位置的两个元素。
  12. Main 方法(模型使用):通过一系列任务执行 CustomHeaps 类的使用。

堆(内存堆)

“堆”是计算机内存的一部分,用于进行动态内存分配。在 C 和 C++ 等某些编程语言中,可以通过调用 malloc 和 new 函数在堆上分配内存。在堆上分配的内存可以保留,直到被物理释放,因此提供了一种比堆栈更灵活的方法。

What's the relationship between a heap and the heap

Java 代码实现

说明

1. 数组初始化

代码创建一个大小为 5 的整数数组 arr。

int arr[] = new int[5];

2. 数组填充

使用 for 循环在数组中创建从 0 到 4 的值。

for (int i = 0; i< 5; i++) { arr[i] = i; }

现在,数组已变为 {0, 1, 2, 3, 4}。

3. 数组访问和输出

然后,代码片段显示第一个数组元素 (arr[0]) 和第二个元素 (arr[1])。

System.out.println(arr[0]); 将输出第 0 个元素。

System.out.println(arr[1]); - 将显示第二个元素 (1)。

4. 输出:代码详细描述了如何初始化、填充和检索简单整数数组的元素。

“一个”堆与“那个”堆的关系?

  • 堆只是一个描述任何堆数据结构的通用术语,它是计算机科学中的一个编程概念。通常,当使用“堆”一词时,指的是在相关场景中发现的特定堆。
  • “一个”堆是面向堆数据结构的一个抽象数据结构,从而展示了它的属性和行为。“那个”堆是被称为堆的最广泛的数据结构的一个实际实例,该实例存在于特定的软件或特定的应用程序中。
  • “一个”堆通常在许多算法问题、数据结构设计和理论分析中代表堆数据结构。“那个”堆是感兴趣的对象,您将处理在当前程序或算法中正在操作或分析的特定堆实例。

结论

简而言之,堆有两种用法:第一,它可以是用于优先队列操作的数据结构,如二叉堆或二项堆;第二,它可以是计算机内存中用于动态内存分配的区域。在数据结构方面,堆主要构建在具有某些特殊属性的二叉树概念之上。