对于数组长度为 5 的简单问题(实际上数组长度可能为 20..)
我有一组预定义的模式,例如AAAAB、AAABA、BAABC、BCAAA、 ...。每个模式与输入数组的长度相同。我需要一个函数,它将任何整数数组作为输入,并返回它匹配的所有模式。(一个数组可能匹配一些模式)尽可能快。
“ 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)
如果模式的数量是n,模式/数组的长度是m,那么复杂度大约是O(n*m)
更新:
请随时为问题提出更好的措辞,因为我不知道如何使问题简单易懂而不会造成混淆。
理想的算法需要某种准备,例如将模式集转换为决策树。因此对于某些特殊模式集,预处理后的复杂性可以达到 O(log n * log m) 之类的东西。(只是猜测)
一些可能有用的数字:预定义模式集的大小约为 30。要匹配的输入数组的数量约为 1000 万。
比如说,如果AAAAA和AAAAC都在预定义的模式集中。那么如果AAAAA匹配,则 AAAAC 也匹配。我正在寻找一种可以识别的算法。
更新 2
@Gareth Rees 的答案给出了一个 O(n) 解决方案,但假设没有很多“ C ”。(否则存储量很大,很多不必要的比较)
我也欢迎任何关于如何处理有许多“ C ”的情况的想法,例如,对于长度为 20 的输入数组,每个预定义模式至少有 10 个“ C ”。