在n条短信中查找m个关键字,怎么让时间复杂度不是n*m
现在有一个海量的用户短信文件(n量级),每一行是用户的一个短信。此时,还有一个海量的关键词库(m量级),每一行是一个关键词。给出一种数据结构的设计,统计在用户的短信中,出现频率最高的前10个关键词。
我的解法:
首先,该问题并非短信的判重或者计频,因此无法用HASH表或者Trie树来解决。关键词在字符串内的查找属于模式匹配问题,推荐是用KMP算法。
其次,由于用户短信数据是海量的,因此无法一次性加载到内存中,必须对用户文件进行切割,切割过程考虑使用HASH映射的方式进行。我们将SHA 1 HASH值对1024取模相同的短信数据放置到同一个文件碎片当中。 文件切割耗时是O(n),其中n是短信数据的量级。
其三,关键词库也非常大,无法一次加载到内存中,于是还需要对关键词库进行分割。关键词库同样按照SHA1 HASH 取模的方式分割为各个碎片,切割耗时是O(m)。m是关键词库的规模。当然,如果关键词出现同样前缀的情况较多的话,用Trie来分割关键词也不错。比如CCNA和CCTV就有CC这两个共同的前缀。
取短信文件的每一部分,对所有关键词文件的每一分片查找各个短信中出现的关键词,并统计频率。我能想到的算法还只能停留在对每一个短信检索所有关键词的地步,这个真是求超越。整个模式匹配的时间是O(n*m)。
生成一个10个元素大小的小顶堆,对每一个关键词分片文件中统计的频率进行堆排序,其算法是如果频率大于堆顶,则堆顶元素就被该关键词的频率代替并重新调整堆。这样就求出了每一个关键词文件分片的TOP10. 然后再把这些统计结果归并再求TOP10. 对于空间来说是O(1),对于时间来说是O(M*10log10)。
我的解法:
首先,该问题并非短信的判重或者计频,因此无法用HASH表或者Trie树来解决。关键词在字符串内的查找属于模式匹配问题,推荐是用KMP算法。
其次,由于用户短信数据是海量的,因此无法一次性加载到内存中,必须对用户文件进行切割,切割过程考虑使用HASH映射的方式进行。我们将SHA 1 HASH值对1024取模相同的短信数据放置到同一个文件碎片当中。 文件切割耗时是O(n),其中n是短信数据的量级。
其三,关键词库也非常大,无法一次加载到内存中,于是还需要对关键词库进行分割。关键词库同样按照SHA1 HASH 取模的方式分割为各个碎片,切割耗时是O(m)。m是关键词库的规模。当然,如果关键词出现同样前缀的情况较多的话,用Trie来分割关键词也不错。比如CCNA和CCTV就有CC这两个共同的前缀。
取短信文件的每一部分,对所有关键词文件的每一分片查找各个短信中出现的关键词,并统计频率。我能想到的算法还只能停留在对每一个短信检索所有关键词的地步,这个真是求超越。整个模式匹配的时间是O(n*m)。
生成一个10个元素大小的小顶堆,对每一个关键词分片文件中统计的频率进行堆排序,其算法是如果频率大于堆顶,则堆顶元素就被该关键词的频率代替并重新调整堆。这样就求出了每一个关键词文件分片的TOP10. 然后再把这些统计结果归并再求TOP10. 对于空间来说是O(1),对于时间来说是O(M*10log10)。
...全文
相关推荐
SQL查找某一条记录的方法
SQL查找某一条记录的方法
腾讯音乐秋招笔试全攻略:题型解析与编程题实战技巧
校招笔试是大厂技术岗筛选候选人的核心环节,其背后考察的是算法基础、计算机综合素养与临场时间管理能力。在线笔试平台如赛码网广泛用于各大互联网公司,熟悉其操作流程、判题逻辑和题型结构,能显著降低陌生环境带来的发挥波动。从技术原理看,客观题覆盖操作系统、网络、数据库和编程语言基础,编程题则聚焦哈希表、动态规划、二叉树等经典算法模型。深入理解这些知识点的本质,不仅有助于解决具体题目,更能提升面对业务包装类问题的抽象建模能力。备考阶段,合理分配答题顺序、掌握暴力拿分策略、规避不定项选择倒扣分陷阱,都是提高通过率的关键
SQL 取n到m条记录
T-SQL语句主要用于取n到m条记录,有效的利用SQL 资源
查找m到n之间的k个素数并输出 C++ MFC 实现
C++课程设计 查找m到n之间的k个素数并输出 C++ MFC 实现,
根号n段归并排序算法时间复杂度分析过程
根号n段归并排序算法时间复杂度分析过程: 1.合并 根号n向下取整 段子数组使用的是自底向上两两归并的策略 2.根号n段归并排序算法时间复杂度的数学推导


