• 详解Java堆的应用场景,思路分析,代码实现


    1.前言

    堆作为一种数据结构,具有以下几个优点:

    1. 高效的插入和删除操作:堆的插入和删除操作的时间复杂度都是O(logn),其中n是堆中元素的个数。这是因为堆的结构保证了根节点是最大或最小元素,因此在插入或删除元素时只需要对部分节点进行调整,而不需要对所有节点进行遍历。这使得堆在动态维护一组元素中的最大或最小值时非常高效。

    2. 快速找到最大或最小元素:堆的结构保证了根节点是最大或最小元素,因此可以在常数时间内找到最大或最小元素。这对于需要频繁查找最大或最小值的应用非常有用,例如优先队列、任务调度等。

    3. 堆排序:堆排序是一种利用堆进行排序的算法,其时间复杂度为O(nlogn),并且具有原地排序的特点。堆排序不仅可以得到有序的结果,还可以同时支持升序和降序排序。

    4. 可以用于解决一些经典问题:堆可以用来解决一些经典的问题,例如求解Top K问题(查找前K大或前K小的元素)、求解中位数问题等。通过合理地利用堆的性质,可以高效地解决这些问题。

    5. 可以用于构建其他数据结构:堆可以作为其他数据结构的基础,例如图算法中的最小生成树算法(Prim算法、Dijkstra算法)、哈夫曼树等。通过将堆与其他数据结构相结合,可以得到更加高效的算法和数据结构。

    综上所述,堆作为一种高效的数据结构,在插入、删除、查找最值等操作上具有显著的优势,并且可以应用于各种场景中,提供高效的解决方案。

    2.思路分析 

    当我们实现大顶堆的数据结构时,可以按照以下步骤进行思路分析:

    1. 首先,我们需要一个数组来存储堆的元素。在构造函数中,我们初始化堆的容量和元素个数,并创建一个具有指定容量的整型数组来表示堆。

    2. insert(int value) 方法用于向堆中插入一个元素。我们首先检查堆是否已满,如果已满则抛出异常。然后,将要插入的元素放在数组的末尾位置,然后调用 siftUp 方法将元素上移,以保持堆的性质。最后,增加堆的元素个数。

    3. extractMax() 方法用于从堆中取出最大值(即堆顶元素)。我们首先检查堆是否为空,如果为空则抛出异常。然后,将堆顶元素与数组末尾的元素交换位置,然后调用 siftDown 方法将新的堆顶元素下移,以保持堆的性质。最后,减少堆的元素个数,并返回之前的堆顶元素。

    4. siftUp(int index) 方法用于将指定位置的元素上移,直到满足堆的性质。我们使用一个循环来迭代执行以下操作:首先,计算父节点的索引(通过 (index - 1) / 2)。然后,检查当前元素是否大于其父节点的值。如果不是,则停止上移操作。否则,交换当前元素与父节点的位置,并更新当前元素的索引为父节点的索引。继续迭代直到满足堆的性质。

    5. siftDown(int index) 方法用于将指定位置的元素下移,直到满足堆的性质。我们使用一个循环来迭代执行以下操作:首先,计算左子节点和右子节点的索引(通过 2 * index + 12 * index + 2)。然后,找到当前节点、左子节点和右子节点中的最大值的索引。如果当前节点已经是最大值,则停止下移操作。否则,交换当前节点与最大值节点的位置,并更新当前节点的索引为最大值节点的索引。继续迭代直到满足堆的性质。

    6. swap(int i, int j) 方法用于交换数组中两个位置的元素。我们使用一个临时变量来保存一个位置的元素,然后将另一个位置的元素赋值给第一个位置,最后将临时变量的值赋给第二个位置。

    通过以上步骤,我们可以实现一个基本的大顶堆数据结构,并进行插入和删除操作。这样的实现可以帮助我们在堆中快速找到最大值,并保持堆的性质。

    3.代码实现 

    1. package day14;
    2. //大顶堆
    3. public class MaxHeap {
    4. private int[] heap; // 存储堆元素的数组
    5. private int size; // 堆中元素的个数
    6. private int capacity; // 堆的容量
    7. public MaxHeap(int capacity) {
    8. this.capacity = capacity;
    9. this.size = 0;
    10. this.heap = new int[capacity];
    11. }
    12. public void insert(int value) {
    13. if (size >= capacity) {
    14. throw new IllegalStateException("Heap is full");
    15. }
    16. heap[size] = value; // 将元素放在数组末尾
    17. siftUp(size); // 上移元素
    18. size++; // 元素个数加1
    19. }
    20. public int extractMax() {
    21. if (size <= 0) {
    22. throw new IllegalStateException("Heap is empty");
    23. }
    24. int max = heap[0]; // 取出堆顶元素
    25. heap[0] = heap[size - 1]; // 将最后一个元素放到堆顶
    26. size--; // 元素个数减1
    27. siftDown(0); // 下移堆顶元素
    28. return max; // 返回堆顶元素
    29. }
    30. private void siftUp(int index) {
    31. while (index > 0) { // 如果不是根节点
    32. int parentIndex = (index - 1) / 2; // 计算父节点的索引
    33. if (heap[index] <= heap[parentIndex]) { // 如果不大于父节点
    34. break; // 停止上移
    35. }
    36. swap(index, parentIndex); // 交换元素
    37. index = parentIndex; // 更新索引
    38. }
    39. }
    40. private void siftDown(int index) {
    41. while (index < size) { // 如果不是叶子节点
    42. int leftChildIndex = 2 * index + 1; // 计算左子节点的索引
    43. int rightChildIndex = 2 * index + 2; // 计算右子节点的索引
    44. int largestIndex = index; // 假设当前节点最大
    45. if (leftChildIndex < size && heap[leftChildIndex] > heap[largestIndex]) { // 如果左子节点存在且大于当前节点
    46. largestIndex = leftChildIndex; // 更新最大值索引
    47. }
    48. if (rightChildIndex < size && heap[rightChildIndex] > heap[largestIndex]) { // 如果右子节点存在且大于当前节点
    49. largestIndex = rightChildIndex; // 更新最大值索引
    50. }
    51. if (largestIndex == index) { // 如果当前节点就是最大值
    52. break; // 停止下移
    53. }
    54. swap(index, largestIndex); // 交换元素
    55. index = largestIndex; // 更新索引
    56. }
    57. }
    58. private void swap(int i, int j) {
    59. int temp = heap[i];
    60. heap[i] = heap[j];
    61. heap[j] = temp;
    62. }
    63. }

  • 相关阅读:
    Android Studio无法连接设备,一直显示Loading Devices...
    Mac 环境变量配置(待补充)
    Jira—使用 JMX 接口进行实时监控
    HCI OPCDE
    win11系统影响玩游戏吗?适合玩游戏吗?
    Git入门图文教程(深入浅出,详细了解Git,以及操作)
    Java学习Day031(异常)
    使用Android Studio实现按钮监听事件显示图像
    什么是驱动签名?如何为驱动程序获取数字签名?
    【中秋福利】大数据告诉你:今年中秋礼品这样选
  • 原文地址:https://blog.csdn.net/m0_74749208/article/details/134065605