Algorithm 合并而不丢失最准确的顺序

Algorithm 合并而不丢失最准确的顺序,algorithm,Algorithm,我有三个第二分辨率的日志文件 每个文件中都缺少一些日志条目 如何合并而不打乱最准确的顺序 例1 日志文件1 12:00:01 system event 3a 12:00:01 system event 2b 12:00:02 system event 0d 12:00:01 system event 3a 12:00:01 system event 2b 12:00:01 system event 1c 12:00:01系统事件3a 12:00:01系统事件2b 12:00:02系统事件0d

我有三个第二分辨率的日志文件

每个文件中都缺少一些日志条目

如何合并而不打乱最准确的顺序


例1

日志文件1

12:00:01 system event 3a 12:00:01 system event 2b 12:00:02 system event 0d 12:00:01 system event 3a 12:00:01 system event 2b 12:00:01 system event 1c 12:00:01系统事件3a 12:00:01系统事件2b 12:00:02系统事件0d 日志文件2

12:00:01 system event 2b 12:00:02 system event 1c 12:00:02 system event 0d 12:00:01 system event 3a 12:00:01 system event 0d 12:00:01系统事件2b 12:00:02系统事件1c 12:00:02系统事件0d 日志文件3

12:00:01 system event 2b 12:00:01 system event 10z 12:00:02 system event 1c 12:00:02 system event 0d 12:00:01 system event 3a 12:00:01 system event 0d 12:00:01系统事件2b 12:00:01系统事件10z 12:00:02系统事件1c 12:00:02系统事件0d 一次出现

2b出现两次(在3a之后)

这是我认为的主要问题


更新:

例2

日志文件1

12:00:01 system event 3a 12:00:01 system event 2b 12:00:02 system event 0d 12:00:01 system event 3a 12:00:01 system event 2b 12:00:01 system event 1c 12:00:01系统事件3a 12:00:01系统事件2b 12:00:01系统事件1c 日志文件2

12:00:01 system event 2b 12:00:02 system event 1c 12:00:02 system event 0d 12:00:01 system event 3a 12:00:01 system event 0d 12:00:01系统事件3a 12:00:01系统事件0d 日志文件3

12:00:01 system event 2b 12:00:01 system event 10z 12:00:02 system event 1c 12:00:02 system event 0d 12:00:01 system event 3a 12:00:01 system event 0d 12:00:01系统事件3a 12:00:01系统事件0d 好的,在这个例子中,0d在3a之后出现两次,这是一个更可能的顺序。 使用拓扑排序将产生3a、2b、1c、0d

我认为正确的顺序是3a,0d,2b,1c


我现在不知道怎么做。

听起来你想混合使用合并和拓扑排序。

我认为拓扑排序+合并排序的答案是正确的。以下是我对它的看法,具体如下:

保持指针指向当前位置 在每个日志文件中

查找下一个时间戳(跨越所有 文件)。只考虑那些事件 我有时间戳。(并非所有日志文件 一定会有事件发生。)

所有的事件都是在同一时间发生的 在图形中标记窗体顶点。 每个日志文件(包含该日志文件的行) 同一时间戳)使您在 您的图形(只有一个图形, 跨所有三个日志文件)。你得到 通过读取单个日志文件, 具有相同时间戳的所有行,以及 对于每一行和下一行,添加一条边

那次做拓扑排序 邮票

现在转到下一个时间戳

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 
在您的示例中,您将从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只有一个事件,因此没有边。 日志文件3提供了2b->10z的边缘

进行拓扑排序得到3a,2b,10z

(不清楚您是否需要对2b执行特殊操作,并打印出“这一次发生两次”或类似的内容。如果您愿意,可以通过在顶点中存储出现次数来实现。)


现在转到12:00:02。等等。

在最坏的情况下,所有的时间都是一样的,你会遇到如下问题:

Logfile 1
12:00:00 system event a
12:00:00 system event b

您无法确定实际序列是aba还是bab。在这种情况下,只报告ab或ba是不正确的

拓扑排序仅在事件唯一时有效。在您的程序中,运行文件,同时获取块。如果您知道事件是唯一的,请对这些块使用拓扑排序。或者更直观地说,您可以通过每次获取一个元素来合并此块中的三个链,而该元素并不出现在任何其他链的当前顶部元素的下方-这实际上是以不同方式表示的同一事物


如果特定时间戳的事件不是唯一的,正确的通用解决方案是对该时间戳使用三向diff。对于你想要的东西来说,这可能有点过分了,但这是唯一真正正确的解决方案。

哇,这是一个快速的答案。。谢谢拓扑排序看起来很有趣。拓扑搜索很好,但它不会占用我的全部时间。我还需要一些统计方法。在你的例子2中,没有证据表明3a,0d,2b,1c比3a,2b,1c好或坏。Logfile2和Logfile3都丢失了2b和1c事件,除非您有其他证据,否则您不知道这是什么时候发生的。拓扑排序可以给出任意一个序列作为答案。如果使用“三链”方法,那么只要有自由选择下一个项目并获得示例2中所需的顺序,您就可以选择出现在两个链中的项目。