必考算法之 Top K 问题

简介: 大家好,这里是《齐姐聊算法》系列之 Top K 问题。

Top K 问题是面试中非常常考的算法题。


image.png


Leetcode 上这两题大同小异,这里以第一题为例。


image.png


题意:给一组词,统计出现频率最高的 k 个。比如说 “I love leetcode, I love coding” 中频率最高的 2 个就是 I 和 love 了。


有同学觉得这题特别简单,但其实这题只是母题,它可以升级到<span style="color:blue;font-weight:bold;">系统设计</span>层面来问:


在某电商网站上,过去的一小时内卖出的最多的 k 种货物。


我们先看算法层面:


<span style="color:orangered;font-weight:bold;">思路:


统计下所有词的频率,然后按频率排序取最高的前 k 个呗。


<span style="color:orangered;font-weight:bold;">细节:


用 HashMap 存放单词的频率,用 minHeap/maxHeap 来取前 k 个。


<span style="color:orangered;font-weight:bold;">实现:


  1. 建一个 HashMap <key = 单词,value = 出现频率>,遍历整个数组,相应的把这个单词的出现次数 + 1.这一步时间复杂度是 O(n).


  1. 用 size = k 的 minHeap 来存放结果,定义好题目中规定的比较顺序


a. 首先按照出现的频率排序;
b. 频率相同时,按字母顺序。


  1. 遍历这个 map,如果


a. minHeap 里面的单词数还不到 k 个的时候就加进去;
b. 或者遇到更高频的单词就把它替换掉。


<span style="color:orangered;font-weight:bold;">时空复杂度分析:


第一步是 O(n),第三步是 nlog(k),所以加在一起时间复杂度是 O(nlogk).


用了一个额外的 heap 和 map,空间复杂度是 O(n).


代码:


class Solution {
    public List<String> topKFrequent(String[] words, int k) {
        // Step 1
        Map<String, Integer> map = new HashMap<>();
        for (String word : words) {
            Integer count = map.getOrDefault(word, 0);
            count++;
            map.put(word, count);
        }
        // Step 2
        PriorityQueue<Map.Entry<String, Integer>> minHeap = new PriorityQueue<>(k+1, new Comparator<Map.Entry<String, Integer>>() {
            @Override
            public int compare(Map.Entry<String, Integer> e1, Map.Entry<String, Integer> e2) {
                if(e1.getValue() == e2.getValue()) {
                    return e2.getKey().compareTo(e1.getKey());
                }
                return e1.getValue().compareTo(e2.getValue());
            }
        });
        // Step 3
        List<String> res = new ArrayList<>();
        for(Map.Entry<String, Integer> entry : map.entrySet()) {
            minHeap.offer(entry);
            if(minHeap.size() > k) {
                minHeap.poll();
            }
        }
        while(!minHeap.isEmpty()) {
            res.add(minHeap.poll().getKey());
        }
        Collections.reverse(res);
        return res;
    }
}


如果你喜欢这篇文章,记得给我点赞留言哦~你们的支持和认可,就是我创作的最大动力,我们下篇文章见!


我是小齐,纽约程序媛,终生学习者,每天晚上 9 点,云自习室里不见不散!

目录
相关文章
|
5月前
|
算法
【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素
【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素
|
存储 自然语言处理 算法
ML之K-means:基于K-means算法利用电影数据集实现对top 100 电影进行文档分类
ML之K-means:基于K-means算法利用电影数据集实现对top 100 电影进行文档分类
ML之K-means:基于K-means算法利用电影数据集实现对top 100 电影进行文档分类
|
自然语言处理 算法 数据挖掘
ML之H-Clusters:基于H-Clusters算法利用电影数据集实现对top 100电影进行文档分类
ML之H-Clusters:基于H-Clusters算法利用电影数据集实现对top 100电影进行文档分类
ML之H-Clusters:基于H-Clusters算法利用电影数据集实现对top 100电影进行文档分类
|
机器学习/深度学习 人工智能 算法
【AI TOP 10】今日头条首次公布算法;马云“认真考虑”在港上市;高通收购恩智浦获欧盟批准
马云近日称将“认真考虑”在香港上市;今日头条首次公布算法原理;高通收购恩智浦已获欧盟批准;AI成为直播答题“作弊”辅助工具;索尼发布新款AI狗,价格约为1.2万元人民币。
3591 0
|
算法 搜索推荐 机器学习/深度学习
|
算法 数据处理
海量数据处理的 Top K算法(问题) 小顶堆实现
  问题描述:有N(N>>10000)个整数,求出其中的前K个最大的数。(称作Top k或者Top 10)   问题分析:由于(1)输入的大量数据;(2)只要前K个,对整个输入数据的保存和排序是相当的不可取的。
1032 0
|
1月前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
8天前
|
算法 数据安全/隐私保护 索引
OFDM系统PAPR算法的MATLAB仿真,对比SLM,PTS以及CAF,对比不同傅里叶变换长度
本项目展示了在MATLAB 2022a环境下,通过选择映射(SLM)与相位截断星座图(PTS)技术有效降低OFDM系统中PAPR的算法实现。包括无水印的算法运行效果预览、核心程序及详尽的中文注释,附带操作步骤视频,适合研究与教学使用。
下一篇
无影云桌面