经典编程面试题--大文件找重复内容

关注我,持续分享逻辑思维&管理思维&面试题; 可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;

推荐专栏10天学会使用asp.net编程AI大模型,目前已完成所有内容。一顿烧烤不到的费用,让人能紧跟时代的浪潮。从普通网站,到公众号、小程序,再到AI大模型网站。干货满满。学成后可接项目赚外快,绝对划算。不仅学会如何编程,还将学会如何将AI技术应用到实际问题中,为您的职业生涯增添一笔宝贵的财富。

-------------------------------------正文----------------------------------------

有一千万条短信,有重复,以文本文件的形式保存,一行一条,有重复。请用5分钟时间,找出重复出现最多的前10条。

-------------------------------------答案----------------------------------------

要在有限的时间内(如5分钟)处理一千万条短信并找出重复出现最多的前10条,我们需要采用高效的算法和数据结构。由于短信数量巨大,直接将所有短信加载到内存中可能会导致内存不足。因此,我们可以考虑使用外部排序(如多路归并排序)和哈希表(或类似结构)来优化存储和查找效率。

但是,考虑到时间限制和编程复杂性,我们可以采用一种更实际的方法:使用内存中的哈希表来记录每个短信的出现次数,并在哈希表满或处理完所有短信后,将哈希表中的数据写入外部文件(如临时文件),然后对这些数据进行排序以找出重复次数最多的前10条。

然而,为了简化实现并尽可能减少编程时间,这里我将提供一个简化的C++示例,它假设系统有足够的内存来存储哈希表,并使用标准库中的unordered_map来记录短信的出现次数,然后使用priority_queue(最大堆)来找出前10个最常见的短信。

注意:这个示例在内存使用上可能不是最优的,特别是当短信数量极大时,但它能够在较短时间内给出结果。

#include <iostream>  
#include <fstream>  
#include <sstream>  
#include <string>  
#include <unordered_map>  
#include <vector>  
#include <queue>  
#include <functional>  
  
struct Compare {  
    bool operator()(const std::pair<std::string, int>& lhs, const std::pair<std::string, int>& rhs) {  
        return lhs.second < rhs.second; // 最大堆  
    }  
};  
  
int main() {  
    std::ifstream file("sms.txt");  
    std::string line;  
    std::unordered_map<std::string, int> smsCount;  
  
    // 读取文件并统计短信出现次数  
    while (std::getline(file, line)) {  
        smsCount[line]++;  
    }  
  
    // 使用最大堆找出前10个最常见的短信  
    std::priority_queue<std::pair<std::string, int>, std::vector<std::pair<std::string, int>>, Compare> pq;  
    for (const auto& entry : smsCount) {  
        if (pq.size() < 10) {  
            pq.push(entry);  
        } else if (entry.second > pq.top().second) {  
            pq.pop();  
            pq.push(entry);  
        }  
    }  
  
    // 输出结果  
    while (!pq.empty()) {  
        std::cout << pq.top().first << ": " << pq.top().second << std::endl;  
        pq.pop();  
    }  
  
    return 0;  
}

注意

  1. 这个程序假设所有短信都能存储在内存中。如果短信数量过多,导致内存不足,你需要考虑使用外部排序或数据库技术。
  2. sms.txt是包含短信的文本文件,每行一条短信。
  3. 程序首先读取文件并统计每条短信的出现次数。
  4. 然后,它使用一个最大堆(通过自定义比较函数)来维护出现次数最多的前10条短信。
  5. 最后,程序输出这10条短信及其出现次数。

如果你需要处理的数据量真的非常大,以至于不能全部加载到内存中,你可能需要考虑使用数据库系统或分块处理数据,并在磁盘上维护排序的索引或结果。

 

感兴趣的同学辛苦 关注/点赞 ,持续分享逻辑、算法、管理、技术、人工智能相关的文章。

有意找工作的同学,请参考博主的原创:《面试官心得--面试前应该如何准备》,《面试官心得--面试时如何进行自我介绍》, 《做好面试准备,迎接2024金三银四》。
或关注博主免费专栏【程序员宝典--常用代码分享】里面有大量面试涉及的算法或数据结构编程题。

博主其它经典原创:《管理心得--如何高效进行跨部门合作》,《技术心得--如何成为优秀的架构师》、《管理心得--如何成为优秀的架构师》、《管理心理--程序员如何选择职业赛道》,及
C#实例:SQL如何添加数据》,《C#实战分享--爬虫的基础原理及实现》欢迎大家阅读。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

借雨醉东风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值