📅  最后修改于: 2023-12-03 15:10:16.716000             🧑  作者: Mango
该问题涉及到数据结构的实现和算法的设计。问题描述如下:
给定一个长度为 n 的无序数组,设计一个算法来找到前 k 个常出现的数。您可以假设 k 总是小于等于 n,时间复杂度必须为 O(nlogk ) 或更快。
该算法使用基于二叉堆的最小堆来实现,其时间复杂度为 O(nlogk)。
步骤如下:
算法代码:
import heapq
from collections import defaultdict
def frequent_numbers(arr, k):
count = defaultdict(int)
for num in arr:
count[num] += 1
min_heap = []
for num, freq in count.items():
if len(min_heap) < k:
heapq.heappush(min_heap, (freq, num))
else:
if freq > min_heap[0][0]:
heapq.heappop(min_heap)
heapq.heappush(min_heap, (freq, num))
result = []
while min_heap:
result.append(heapq.heappop(min_heap)[1])
return result[::-1]
以下是该算法的样例输入输出:
input: [1,2,3,4,5,5,5,5], 2 output: [5, 4]
input: [1,1,1,2,2,3], 2 output: [1, 2]
通过该算法,我们可以快速地找出数组中出现频率最高的前k个数,其时间复杂度为 O(nlogk),可以处理大规模的数据集。