1 solutions
-
0
思路分析
本题要求设计一种算法机制来抑制重复日志,满足以下两个条件:
- 相同日志的抑制:如果在
10
毫秒内出现相同的日志,则只保留第一个。 - 相似日志的抑制:如果在
100
毫秒内出现10
条相似的日志(去除数字后字符相同),则只保留前9
条。
可以使用两种方法:
-
暴力双重循环:
- 遍历每个日志时,从前面已读取的有效日志中检查:
10
毫秒内的相同日志数量。100
毫秒内的相似日志数量。
- 若满足抑制条件,则将日志标记为抑制日志。
- 时间复杂度为
O(n^2)
,在最大数据量下可能存在性能问题。
- 遍历每个日志时,从前面已读取的有效日志中检查:
-
滑动窗口 + 哈希表:
- 采用两个滑动窗口分别记录
10
毫秒和100
毫秒内的日志信息。 - 使用两个哈希表分别记录
10
毫秒内相同日志的次数,以及100
毫秒内相似日志的次数。 - 每次读入日志时,更新滑动窗口并维护哈希表。
- 根据哈希表的记录判断日志是否需要抑制。
- 时间复杂度为
O(n)
,更适合处理大规模数据。
- 采用两个滑动窗口分别记录
算法流程
步骤1:读取输入的日志数据。
- 遍历每一条日志,解析出时间戳和日志内容。
- 使用辅助函数
remove_digits
去除日志中的数字,以判断相似日志。
步骤2:维护滑动窗口和哈希表。
- 使用两个滑动窗口:
- 一个窗口记录
10
毫秒内的日志数量,以判断相同日志数量。 - 一个窗口记录
100
毫秒内的日志数量,以判断相似日志数量。
- 一个窗口记录
- 每次读取日志时,根据时间差更新滑动窗口,移除不在窗口范围内的日志,并更新哈希表。
步骤3:判断抑制条件。
- 若当前日志在
10
毫秒内有相同日志,或100
毫秒内有9
条相似日志,则标记为抑制日志。 - 否则,更新哈希表,将日志加入有效日志集合。
时间复杂度
该方法时间复杂度为
O(n)
,其中n
是日志条数,因为每个日志的判断和窗口更新操作都是常数级别。适合处理大规模数据。代码实现
Python代码(暴力双重循环)
Java & C++ 代码
限于篇幅问题,这里只给出提交记录链接
Python代码(滑动窗口 + 哈希表优化)
代码注释说明
- remove_digits 函数:该函数用于去除字符串中的数字,以便判断相似日志。只保留字母和符号的顺序。
- 暴力双重循环:遍历每一条日志时,向前检查是否满足抑制条件。
- 滑动窗口+哈希表:
mp_10
和mp_100
分别记录10ms
和100ms
窗口内的相同和相似日志次数。每次更新窗口时移除超出时间范围的日志记录。 - 输出结果:最终输出被判定为抑制的日志。
- 相同日志的抑制:如果在
- 1
Information
- ID
- 32
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 4
- Tags
- # Submissions
- 230
- Accepted
- 41
- Uploaded By