合并而不会失去最准确的订单

时间:2010-12-05 06:01:11

标签: algorithm

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

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

如何合并而不会弄乱最准确的订单?


示例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。

我现在不知道该怎么做。

3 个答案:

答案 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>

如果特定时间戳的事件不是唯一的,那么正确的一般解决方案是对该时间戳使用三向差异。对你想要的东西来说可能有些过分,但这是唯一真正正确的解决方案。