【数据结构】堆

举报
幼儿园老大* 发表于 2024/10/29 21:15:18 2024/10/29
【摘要】 一、堆的定义堆(Heap)是一种特殊的完全二叉树数据结构。分为最大堆和最小堆。最大堆中,每个节点的值都大于等于其子节点的值;最小堆中,每个节点的值都小于等于其子节点的值。二、堆的基本操作插入元素(Insert):将新元素插入到堆的末尾。然后通过不断比较新元素与其父节点的值,进行上滤操作,直到满足堆的性质。时间复杂度为 O (log n),其中 n 是堆中元素的个数。删除根节点(Delete ...
一、堆的定义


堆(Heap)是一种特殊的完全二叉树数据结构。分为最大堆和最小堆。


最大堆中,每个节点的值都大于等于其子节点的值;最小堆中,每个节点的值都小于等于其子节点的值。


二、堆的基本操作


  1. 插入元素(Insert)
    • 将新元素插入到堆的末尾。
    • 然后通过不断比较新元素与其父节点的值,进行上滤操作,直到满足堆的性质。
    • 时间复杂度为 O (log n),其中 n 是堆中元素的个数。
  2. 删除根节点(Delete Root)
    • 通常删除的是根节点,因为在最大堆中根节点是最大值,在最小堆中根节点是最小值。
    • 用堆的最后一个元素替换根节点。
    • 然后对新的根节点进行下滤操作,使其满足堆的性质。
    • 时间复杂度为 O (log n)。
  3. 获取根节点(Get Root)
    • 直接返回堆的根节点的值,时间复杂度为 O (1)。
  4. 堆化(Heapify)
    • 给定一个数组,可以将其转换为堆。
    • 从最后一个非叶节点开始,对每个非叶节点进行下滤操作,直到根节点。
    • 时间复杂度为 O (n),其中 n 是数组的长度。


三、代码实现


以下是用 Java 语言实现最大堆的代码示例:
class MaxHeap {
    private int[] heap;
    private int size;

    public MaxHeap(int capacity) {
        heap = new int[capacity];
        size = 0;
    }

    public void insert(int value) {
        if (size == heap.length) {
            throw new IllegalStateException("Heap is full");
        }
        heap[size] = value;
        int index = size;
        while (index > 0 && heap[index] > heap[parent(index)]) {
            swap(index, parent(index));
            index = parent(index);
        }
        size++;
    }

    public int deleteMax() {
        if (size == 0) {
            throw new IllegalStateException("Heap is empty");
        }
        int max = heap[0];
        heap[0] = heap[size - 1];
        size--;
        heapify(0);
        return max;
    }

    private int parent(int index) {
        return (index - 1) / 2;
    }

    private int leftChild(int index) {
        return 2 * index + 1;
    }

    private int rightChild(int index) {
        return 2 * index + 2;
    }

    private void swap(int i, int j) {
        int temp = heap[i];
        heap[i] = heap[j];
        heap[j] = temp;
    }

    private void heapify(int index) {
        int largest = index;
        int left = leftChild(index);
        int right = rightChild(index);
        if (left < size && heap[left] > heap[largest]) {
            largest = left;
        }
        if (right < size && heap[right] > heap[largest]) {
            largest = right;
        }
        if (largest!= index) {
            swap(index, largest);
            heapify(largest);
        }
    }
}

public class HeapExample {
    public static void main(String[] args) {
        MaxHeap maxHeap = new MaxHeap(10);
        maxHeap.insert(10);
        maxHeap.insert(5);
        maxHeap.insert(30);
        maxHeap.insert(8);
        maxHeap.insert(15);

        System.out.println("删除最大值:" + maxHeap.deleteMax());
        System.out.println("删除最大值:" + maxHeap.deleteMax());
    }
}


收起
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。