数据结构与算法之 leetcode 数组前 K 个高频元素优化 堆结构

数据结构与算法阿木 发布于 9 天前 4 次阅读


数组前 K 个高频元素优化(堆结构)——LeetCode算法解析

在数据结构与算法的学习过程中,LeetCode是一个不可或缺的平台。它提供了大量的编程题目,涵盖了从基础到高级的各种算法题。其中,数组前 K 个高频元素是一个典型的算法问题,它要求我们在一个未排序的数组中找出出现频率最高的前 K 个元素。本文将围绕这一主题,探讨使用堆结构优化算法的解决方案。

问题分析

给定一个整数数组 `nums` 和一个整数 `k`,返回数组中出现频率最高的前 `k` 个元素。例如,对于输入 `nums = [1,1,1,2,2,3,4,4,4,4]` 和 `k = 2`,输出应为 `[4,4]`。

堆结构简介

堆(Heap)是一种特殊的完全二叉树,它满足以下性质:

1. 大根堆:每个父节点的值都大于或等于其子节点的值。

2. 小根堆:每个父节点的值都小于或等于其子节点的值。

堆结构常用于实现优先队列,它支持以下操作:

- `heappush(heap, item)`: 将元素 `item` 添加到堆中。

- `heappop(heap)`: 从堆中移除并返回具有最高(或最低)优先级的元素。

- `heapify(heap)`: 将堆转换为一个满足堆性质的数据结构。

堆结构优化算法

为了找到数组中出现频率最高的前 K 个元素,我们可以使用以下步骤:

1. 使用一个字典 `count` 来记录数组中每个元素的出现次数。

2. 使用一个最小堆 `min_heap` 来存储出现频率最高的元素。

3. 遍历字典 `count`,对于每个元素,如果堆的大小小于 K,则将元素加入堆中;如果堆的大小等于 K,则比较当前元素的出现次数与堆顶元素的出现次数,如果当前元素的出现次数更高,则将堆顶元素弹出,再将当前元素加入堆中。

4. 堆中的元素即为出现频率最高的前 K 个元素。

以下是使用 Python 实现的代码:

python

import heapq

def topKFrequent(nums, k):


count = {}


for num in nums:


count[num] = count.get(num, 0) + 1



min_heap = []


for num, freq in count.items():


if len(min_heap) < k:


heapq.heappush(min_heap, (freq, num))


else:


heapq.heappushpop(min_heap, (freq, num))



return [num for freq, num in sorted(min_heap, reverse=True)]

测试代码


nums = [1,1,1,2,2,3,4,4,4,4]


k = 2


print(topKFrequent(nums, k)) 输出: [4, 4]


优化分析

使用堆结构优化算法相比于直接排序数组的方法,具有以下优势:

1. 时间复杂度:堆结构优化算法的时间复杂度为 O(n log k),其中 n 是数组长度,k 是要找的前 K 个高频元素的数量。而直接排序数组的时间复杂度为 O(n log n)。

2. 空间复杂度:堆结构优化算法的空间复杂度为 O(k),而直接排序数组的空间复杂度为 O(n)。

总结

本文介绍了使用堆结构优化算法解决数组前 K 个高频元素问题的方法。通过使用堆结构,我们可以有效地找到出现频率最高的前 K 个元素,并提高了算法的效率。在实际应用中,堆结构是一种非常实用的数据结构,它可以帮助我们解决许多与优先级相关的问题。