返回
面试神器:掌握堆算法,秒杀Top k高频问题
前端
2024-01-10 17:38:14
作为一名程序员,在面试中遇到Top k问题可谓司空见惯。虽然它看似复杂,但借助堆算法,你就能轻松应对。
在本文中,我们将深入剖析堆算法,并手把手教你如何利用它解决Top k问题。
堆算法简介
堆算法是一种基于二叉树的数据结构,它具有以下特点:
- 完全二叉树: 堆必须是一棵完全二叉树,即除了最后一层可能未满之外,其他每一层都应填满。
- 最大堆: 每个节点的值都大于或等于其子节点的值,形成一个最大堆。
- 最小堆: 每个节点的值都小于或等于其子节点的值,形成一个最小堆。
利用堆算法解决Top k问题
现在,让我们看看如何使用堆算法解决Top k问题。
- 构建最大堆: 将输入数据构建为一个最大堆。
- 弹出k个元素: 从最大堆中依次弹出k个元素,这些元素就是Top k。
示例:求数组[3, 5, 1, 7, 2, 4, 6]中的Top 3
- 构建最大堆:
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)
- 弹出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问题的一大利器。无论是在面试中还是实际开发中,堆算法都能帮你轻松应对复杂的场景。
希望本文能帮助你理解并应用堆算法,提升你的编程技能和面试竞争力。