如何按匹配优质词汇数量排序评论数组并适配大规模输入?
按优质词汇匹配数排序评论的解决方案
这个问题在编程竞赛里属于典型的统计匹配度+索引排序问题,思路清晰,选对数据结构的话,哪怕是大规模输入也能高效处理。我一步步给你拆解:
核心思路
- 快速匹配优质词汇:把优质词汇转成哈希集合,这样判断某个词汇是否属于优质词汇的时间复杂度是O(1),这是处理大规模数据的关键。
- 统计每个评论的匹配数:遍历每个评论,拆分词汇后统计其中属于优质集合的数量,同时记录评论的原始索引(因为最终要输出原数组的索引顺序)。
- 按匹配数排序索引:根据统计的匹配数对索引进行降序排序;如果匹配数相同,保持原数组的相对顺序(可选,示例里没这种情况,但加上会更严谨)。
数据结构选择:哈希集合(Hash Set)
为什么选哈希集合?
- 对比数组存储:如果用数组存优质词汇,每次判断是否存在需要O(k)时间(k是优质词汇数量),当k很大时,这个开销会被放大很多倍。
- 哈希集合的平均查找时间是O(1),不管k多大,单次判断都很快,完美适配大规模输入场景。
代码示例(Python)
用Python实现的话,代码简洁且高效,非常适合竞赛场景:
def sort_comments_by_quality(quality_words_str, comments): # 将优质词汇转换为哈希集合,O(k)时间复杂度,k为优质词汇数量 quality_set = set(quality_words_str.split('_')) # 存储(原始索引,匹配数量)的列表 indexed_matches = [] for idx, comment in enumerate(comments): match_count = 0 # 拆分当前评论的词汇并统计匹配数 for word in comment.split('_'): if word in quality_set: match_count += 1 indexed_matches.append((idx, match_count)) # 排序规则:先按匹配数降序,再按原始索引升序(保证同匹配数的评论保持原顺序) indexed_matches.sort(key=lambda x: (-x[1], x[0])) # 提取排序后的原始索引,作为最终结果 return [item[0] for item in indexed_matches] # 测试示例输入 quality_input = "pool_clean_food" comments_input = ["food_bedroom_environment", "view_sea_desert", "clean_pool_table"] print(sort_comments_by_quality(quality_input, comments_input)) # 输出: [2, 0, 1]
大规模输入的优化要点
如果遇到百万级的评论或者上万级的优质词汇,这些优化能帮你提升效率:
- 哈希集合的高效性:不管优质词汇数量多少,查找都是O(1),这是核心优化点,避免了线性查找的巨大开销。
- 内存优化:不需要存储所有拆分后的词汇,边拆分边统计,减少内存占用。
- 排序效率:Python内置的
sort是Timsort算法,时间复杂度O(n log n),是目前最高效的排序算法之一,适合大规模数据排序。 - 语言层面优化:如果用Java/C++,可以用
HashSet/unordered_set,拆分字符串时用更高效的工具(比如Java的StringTokenizer),进一步提升速度。
边界情况处理
- 如果优质词汇为空字符串:所有评论的匹配数都是0,输出原索引顺序即可。
- 如果评论为空字符串:匹配数为0,排序时会排在后面。
- 如果评论中有重复的优质词汇:比如评论是
"pool_pool_clean",会统计为3次(如果题目要求统计出现次数);如果题目要求统计不同的优质词汇,那可以先把评论的词汇转成集合再统计,根据题目需求调整即可。
内容的提问来源于stack exchange,提问作者munnu singh
相关产品推荐
相关产品推荐

