【问题标题】:pattern recognition - "is this a pattern?"模式识别——“这是一种模式吗?”
【发布时间】:2013-11-04 23:31:24
【问题描述】:

我有一个很大的数字向量,比如 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 语言实现这样的系统很感兴趣,但是非常欢迎任何一般性指导。

提前谢谢你!

【问题讨论】:

  • 500 不是一个非常大的向量,所以我会先写一些不考虑性能的东西。这样,您就可以针对后来的“更好”的实现进行测试。

标签: c vector


【解决方案1】:

只是一些观察:

如果您对相对值感兴趣,那么您的第一步应该是计算向量相邻元素之间的差异,例如:

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) 时间内计算,如果您只关心精确匹配,可能会更快。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
  • 1970-01-01
  • 2016-01-26
  • 2011-04-23
相关资源
最近更新 更多