我有三个日志文件,第二个分辨率。
每个文件中都缺少一些日志条目。
如何合并而不会弄乱最准确的订单?
示例1
Logfile1
12:00:01 system event 3a 12:00:01 system event 2b 12:00:02 system event 0d
Logfile2
12:00:01 system event 2b 12:00:02 system event 1c 12:00:02 system event 0d
Logfile3
12:00:01 system event 2b 12:00:01 system event 10z 12:00:02 system event 1c 12:00:02 system event 0d
3a出现一次
2b出现两次(之后是3a)
这是我认为的主要问题。
更新:
示例2
Logfile1
12:00:01 system event 3a 12:00:01 system event 2b 12:00:01 system event 1c
Logfile2
12:00:01 system event 3a 12:00:01 system event 0d
Logfile3
12:00:01 system event 3a 12:00:01 system event 0d
好的,在这个例子中,0d在3a之后出现两次,这是一个更可能的顺序。 用拓扑排序对它进行排序将产生3a,2b,1c,0d。
我认为正确的顺序是3a,0d,2b,1c。
我现在不知道该怎么做。
答案 0 :(得分:1)
听起来你想要使用合并和拓扑排序的混合。
答案 1 :(得分:0)
我认为拓扑排序+合并排序答案是正确的。以下是我的看法,具体内容如下:
保持指向当前位置的指针 在每个日志文件中。
找到下一个时间戳(全部 文件)。只考虑那些事件 有时间戳。 (并非所有日志文件 必然会有事件。)
同一时间的所有事件 在图表中标记顶点。 每个日志文件(带有该行的行) 同一时间戳)给你边缘 你的图表(只有一个图表, 跨所有三个日志文件)。你得到 通过读取单个日志文件来获取边缘 所有具有相同时间戳的行,和 对于每一行和下一行,添加一条边。
做那个时间的拓扑排序 邮票。
现在转到下一个时间戳。
因此,在您的示例中,您将从12:00:01时间戳开始。
Logfile1
12:00:01 system event 3a
12:00:01 system event 2b
Logfile2
12:00:01 system event 2b
Logfile3
12:00:01 system event 2b
12:00:01 system event 10z
顶点是3a,2b(多次出现)和10z。
日志文件1为您提供边缘3a-> 2b。 日志文件2只有一个事件,因此没有边缘。 Logfile 3为您提供边缘2b-> 10z。
进行拓扑排序得到3a,2b,10z。
(目前尚不清楚你是否需要对2b做一些特别的事情,并打印出“这一次发生过两次”或类似的事情。如果你愿意的话,通过在顶点中存储出现次数很容易。)< / p>
现在转到12:00:02。等等。
答案 2 :(得分:0)
在最坏的情况下,所有时间都是一样的,你有这样的问题:
Logfile 1
12:00:00 system event a
12:00:00 system event b
和
Logfile 2
12:00:00 system event b
12:00:00 system event a
您无法确定实际序列是aba还是bab。在这种情况下,仅报告ab或仅报告ba是不正确的。
拓扑排序仅在事件是唯一的情况下才有效。在你的程序中运行文件,同时获取块。如果您知道事件是唯一的,请在这些块上使用拓扑排序。或者更直观地说,你可以在这个块中合并三个链,每次使用一个不会出现在任何其他链的当前顶部元素之下的元素 - 这实际上是以不同方式表达的相同事物。 / p>
如果特定时间戳的事件不是唯一的,那么正确的一般解决方案是对该时间戳使用三向差异。对你想要的东西来说可能有些过分,但这是唯一真正正确的解决方案。