【发布时间】:2012-12-03 09:47:41
【问题描述】:
对于数组长度为 5 的简单问题(实际上数组长度可能为 20..)
我有一组预定义模式,例如 AAAAB、AAABA、BAABC、BCAAA、...。 每个模式与输入数组的长度相同。我需要一个函数,它将任何整数数组作为输入,并返回它匹配的 all 模式。 (一个数组可能匹配几个模式)尽可能快。
“A”表示模式中A位置上的所有数字都相等。例如。 AAAAA 仅表示所有数字都相等,{1, 1, 1, 1, 1} 匹配 AAAAA。
“B”表示B位置的数字不等于A位置的数字。(即不是A的数字的通配符)表示的数字B 不必相等。例如。 ABBAA 表示第 1、第 4、第 5 个数字等于 x,而第 2、第 3 个数字不等于 x。 {2, 3, 4, 2, 2} 匹配 ABBAA。
“C”表示该位置可以是任意数字(即数字的通配符)。 {1, 2, 3, 5, 1} 匹配 ACBBA,{1, 1, 3, 5, 1} 也匹配 ACBBA
我正在寻找一种有效的(就比较数而言)算法。它不必是最优的,但不应该是最优的。我觉得它有点像决策树......
一个非常简单但效率低的方法如下:
尝试将每个模式与输入进行匹配。对 {a, b, c, d, e} 说 AABCA。它检查是否
(a=b=e && a!=c)。如果pattern的个数是n,pattern/array的长度是m,那么复杂度大约是O(n* m)
更新:
请随时为问题提出更好的措辞,因为我不知道如何使问题简单易懂且不会造成混淆。
理想的算法需要某种准备,例如将模式集转换为决策树。这样对于某些特殊模式集,在预处理之后的复杂性可以达到 O(log n * log m) 之类的东西。(只是猜测)
一些可能有用的数字:预定义模式集的大小大约为 30。要匹配的输入数组的数量约为 1000 万。
假设 AAAAA 和 AAAAC 都在预定义的模式集中。那么如果 AAAAAA 匹配,AAAAC 也匹配。我正在寻找一种可以识别的算法。
更新 2
@Gareth Rees 的回答给出了一个 O(n) 解决方案,但假设没有很多“C”。 (否则存储量很大,很多不必要的比较)
我也欢迎任何关于如何处理有许多“C”的情况的想法,例如,对于长度为 20 的输入数组,至少有 10 个“C” "s 用于每个预定义的模式。
【问题讨论】:
-
{2, 3, 4, 2, 2}匹配 ABBAA。但是{2, 3, 3, 2, 2}匹配 ABBAA 吗? -
@AlexFilipovici 是的,他们都这样做
-
A是否存在于所有可用的模式中? -
@AlexFilipovici 好吧,我会说是的,否则,没有 A 的模式会使 B 毫无意义,所以它最终会得到所有的 C,这是微不足道的(匹配所有内容)
-
对于长度为
n的给定数组,有n * Math.Pow(2, n - 1)可能的模式。
标签: c# algorithm search pattern-matching decision-tree