2

我有一个文件,如下所示,

150 event4
160 event4
160 event0
170 event4
175 event4
180 event4
190 event4
192 event3
195 event4
----------
----------

第一列是以毫秒为单位的相应事件实际发生的时间。所以 event4 在 150 毫秒内发生。

我有以下任务要做,

  1. 逐行迭代。

  2. 如果连续事件之间的间隔小于 80 毫秒,则它们是单个活动的序列。

例如

100 event4
120 event5 
140 event6
200 event4

它们都具有不超过80毫秒的连续差异。如果差异超过 80 毫秒,则表示当前序列结束,新序列开始。我的目标是对序列进行聚类。并在不同的集群中报告特定事件的数量。因此,在集群 1 中的以下示例中,事件 4 发生了 4 次,事件 5 发生了 1 次,事件 6 发生了 1 次。在第二个集群事件 4 3 次和 event5 1 次。

100 event4
120 event5 
140 event6
200 event4

300 event4
320 event4 
340 event4
400 event5

我现在正在做的是,

  1. 我制作了一个字符串列表。我解析文件,如果小于 80 毫秒,则测量行之间的间隙,然后将它们添加到列表中。
  2. 当我发现一个间隔超过 80 毫秒的事件时,我停止添加并为下一个序列创建一个新列表。
  3. 在将所有序列放在不同的列表中之后,我然后遍历列表以测量特定事件的数量。

我不知道这是否是一种有效的方法。我有一些问题。

  • 我不知道那里有多少个序列簇,所以我想存储特定簇的列表数量是不固定的。
  • 事件名称不固定。它可以是 event1 到 event100 或 event 1 到 45。因此,用于存储事件编号的变量数量也不固定。

那么,你们还有什么好主意吗?

4

1 回答 1

1

这不是人们所说的科学中的“聚类”,而只是分组或聚合。您聚合事件,除非它们间隔时间过长。

至于方法,您正在追求规范方法。除非您的数据已经在复杂的数据库索引中,否则您无法比线性做得更好。只要是文本文件,就只能线性读取。

至于数据结构,将其组织为ArrayList<ArrayList<String>>or并没有错ArrayList<HashMap<String, Integer>>,因为事件 ID 是字符串。内存要求应该适中,并且可以扩展到千兆字节。如果您遇到内存问题,请尝试维护 aHashSet<String>以仅保留每个事件字符串的一份副本,并将时间转换为数字数据类型。然后,当您的事件足够少时,您应该能够加载几 GB。

实际上,我在这里没有看到任何重大挑战。

于 2012-09-12T06:38:23.733 回答