返回

面试神器:掌握堆算法,秒杀Top k高频问题

前端

作为一名程序员,在面试中遇到Top k问题可谓司空见惯。虽然它看似复杂,但借助堆算法,你就能轻松应对。

在本文中,我们将深入剖析堆算法,并手把手教你如何利用它解决Top k问题。

堆算法简介

堆算法是一种基于二叉树的数据结构,它具有以下特点:

  • 完全二叉树: 堆必须是一棵完全二叉树,即除了最后一层可能未满之外,其他每一层都应填满。
  • 最大堆: 每个节点的值都大于或等于其子节点的值,形成一个最大堆。
  • 最小堆: 每个节点的值都小于或等于其子节点的值,形成一个最小堆。

利用堆算法解决Top k问题

现在,让我们看看如何使用堆算法解决Top k问题。

  1. 构建最大堆: 将输入数据构建为一个最大堆。
  2. 弹出k个元素: 从最大堆中依次弹出k个元素,这些元素就是Top k。

示例:求数组[3, 5, 1, 7, 2, 4, 6]中的Top 3

  1. 构建最大堆:
    heap = [0] * 7  # 用一个0填充元素,便于后续操作
    for i in range(len(nums)):
        heap[i + 1] = nums[i]
    
    # 构建最大堆
    for i in range(len(nums) // 2, 0, -1):
        heapify(heap, i)
    
  2. 弹出k个元素:
    result = []
    for i in range(3):
        result.append(heap[1])
        heap[1] = heap[len(heap) - 1]
        heap.pop()
        heapify(heap, 1)
    

代码实现

以下是一个Python实现的堆算法:

class Heap:
    def __init__(self):
        self._heap = [0]

    def add(self, value):
        self._heap.append(value)
        self._count += 1
        self._heapify_up(self._count)

    def pop(self):
        if self._count == 0:
            raise Exception('Heap is empty')

        top = self._heap[1]
        self._heap[1] = self._heap[self._count]
        self._heap.pop()
        self._count -= 1
        self._heapify_down(1)
        return top

    def _heapify_up(self, index):
        while index > 1:
            parent = index // 2
            if self._heap[index] > self._heap[parent]:
                self._heap[index], self._heap[parent] = self._heap[parent], self._heap[index]
            index = parent

    def _heapify_down(self, index):
        while 2 * index <= self._count:
            child = 2 * index
            if child + 1 <= self._count and self._heap[child + 1] > self._heap[child]:
                child += 1

            if self._heap[index] >= self._heap[child]:
                break

            self._heap[index], self._heap[child] = self._heap[child], self._heap[index]
            index = child

结语

通过学习堆算法,你将掌握解决Top k问题的一大利器。无论是在面试中还是实际开发中,堆算法都能帮你轻松应对复杂的场景。

希望本文能帮助你理解并应用堆算法,提升你的编程技能和面试竞争力。