返回

堆结构解密:用它轻松搞定最大值、最小值

前端

堆结构:数据结构中的高效帮手

在计算机科学中,堆是一种特殊的数据结构,具有以下特点:

  • 完全二叉树: 堆结构呈现完全二叉树的形状,其中每个节点都有零个或两个子节点。
  • 最大堆: 父节点的值大于或等于其子节点的值,形成一个最大堆。
  • 最小堆: 父节点的值小于或等于其子节点的值,形成一个最小堆。

最小堆实现:分步拆解

以下是用 C++ 语言实现最小堆结构的步骤:

创建最小堆

class MinHeap {
public:
    vector<int> heap;

    MinHeap(vector<int> arr) {
        heap = arr;
        buildMinHeap();
    }

    void buildMinHeap() {
        for (int i = heap.size() / 2 - 1; i >= 0; i--) {
            minHeapify(i);
        }
    }

    void minHeapify(int i) {
        int smallest = i;
        int left = 2 * i + 1;
        int right = 2 * i + 2;

        if (left < heap.size() && heap[left] < heap[smallest]) {
            smallest = left;
        }

        if (right < heap.size() && heap[right] < heap[smallest]) {
            smallest = right;
        }

        if (smallest != i) {
            swap(heap[i], heap[smallest]);
            minHeapify(smallest);
        }
    }
};

插入元素

void insert(int key) {
    heap.push_back(key);
    int i = heap.size() - 1;

    while (i > 0 && heap[i] < heap[parent(i)]) {
        swap(heap[i], heap[parent(i)]);
        i = parent(i);
    }
}

删除最小元素

int extractMin() {
    if (heap.size() == 1) {
        int root = heap[0];
        heap.pop_back();
        return root;
    }

    int root = heap[0];
    heap[0] = heap[heap.size() - 1];
    heap.pop_back();
    minHeapify(0);

    return root;
}

应用场景:优先级队列

堆结构在计算机科学中广泛应用,其中一个典型应用是实现优先级队列。优先级队列是一种特殊的数据结构,其中元素按优先级排序,优先级高的元素可以优先出队。

最小堆实现的优先级队列:

  • 入队操作:将元素插入最小堆,时间复杂度为 O(log n)。
  • 出队操作:删除最小元素,时间复杂度为 O(log n)。

结语

堆结构是一种高效的数据结构,在许多计算机科学问题中都有着广泛的应用。通过本文对最小堆结构的实现,希望你能深入理解堆结构的工作原理。通过实践,你将能够灵活运用堆结构解决实际问题,在编程实践中游刃有余。