我有一个很大的数字矢量,比如500个数字。我希望有一个程序根据以下规则检测这种向量中的模式(在这种情况下重现):
在以下情况下,数字序列是一种模式:
序列的大小在3到20个数字之间。
依次重复数字的相对位置 至少还有一次在向量中。所以,如果我有一个序列,那就说吧 (1,4,3)然后(3,6,5)在向量中的其他地方然后(1,4,3)是 一种模式。 (以及(2,5,4),(3,6,5)等。)
序列不能相交。因此,矢量(1,2,3,4,5)不会 包含模式(1,2,3)和(3,4,5)(我们不能使用相同的数字 两个序列)。但是,(1,2,3,3,4,5)确实包含一种模式 (1,2,3)(或(3,4,5))
模式B的子集A仅在A出现在某处时才是模式 在B之外的其他地方。因此,矢量(1,2,3,4,7,8,9,2,3,4,5)将包含 模式(1,2,3,4)和(1,2,3),因为(1,2,3,4)重复(在一个 重复(2,3,4,5))和(1,2,3)的形式(以(7,8,9)的形式)。 但是,如果向量是(1,2,3,4,2,3,4,5),那么唯一的模式就是 是(1,2,3,4),因为(1,2,3)仅出现在(1,2,3,4)的上下文中。
我想知道几件事:
首先,我希望这些规则不会互相攻击。我是自己做的,所以可能会发生一些我没注意到的冲突,如果你注意到它,请告诉我。
其次,如何以最有效的方式实施此类系统?也许有人可以指出一些关于这个主题的特定文献?我可以逐个数字开始搜索序列重复的所有子集3,然后4,5和20。但这似乎不是很有效.. 我对在C中实现这样的系统感兴趣,但是非常欢迎任何一般指导。
提前谢谢!
答案 0 :(得分:2)
只有几点意见:
如果您对相对值感兴趣,那么您的第一步应该是计算向量的相邻元素之间的差异,例如:
Original numbers:
1 4 3 2 5 1 1 3 6 5 6 2 5 4 4 4 1 4 3 2
********* ********* ********* *********
Difference values:
3 -1 -1 3 -4 0 2 3 -1 1 4 3 -1 -3 0 -3 3 -1 -1
****** ****** ****** ******
完成后,您可以使用autocorrelation方法查找数据中的重复模式。这可以在 O ( n log n )时间内计算,如果您只关注完全匹配,可能会更快。