📌  相关文章
📜  在线性时间中找到最频繁的k(1)

📅  最后修改于: 2023-12-03 14:51:31.842000             🧑  作者: Mango

在线性时间中找到最频繁的k

假设有一个包含n个元素的序列,怎样在O(n)的时间复杂度内找到其中出现次数最多的k个元素呢?

这个问题可以用哈希表和堆的结构来解决。

代码片段如下:

# 首先建立一个字典,以元素值作为键,以出现次数作为值
dic = {}
for num in nums:
    if num not in dic:
        dic[num] = 1
    else:
        dic[num] += 1

# 利用堆排序,按照出现次数找到出现次数最多的k个元素
heap = []
for key, value in dic.items():
    heapq.heappush(heap, (-value, key))

k_most_frequent = []
for i in range(k):
    k_most_frequent.append(heapq.heappop(heap)[1])

# 输出结果
print(k_most_frequent)

以上代码中,首先利用字典记录每个元素出现的次数;接着利用堆排序,将每个元素按照出现次数的多少插入堆中,并保证堆的大小不超过k;最后取出堆中所有元素即为出现次数最多的k个元素。

以上算法的时间复杂度为O(nlogk),由于k远远小于n,因此可以认为算法的实际时间复杂度为O(n)。