【发布时间】: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 不是一个非常大的向量,所以我会先写一些不考虑性能的东西。这样,您就可以针对后来的“更好”的实现进行测试。