Algorithm 通过数字序列的算法

Algorithm 通过数字序列的算法,algorithm,Algorithm,是否有人知道通过查找某个组合来遍历数字序列的有效算法,例如: 这里有一个给定的序列,我想找到21×73的某个组合的索引,例如 。。。124321947362862188734738 因此,我有一个21×94的模式,需要找出以下索引的位置: 219473 218873 我认为有一种方法可以避免触及每一个数字 编辑: “Lasse V.Karlsen”提出了一个我确实忘记的重要观点。 不允许有重叠,例如 21217373215573 212173是可以的,那么下一个将是215573似乎您正在寻找21

是否有人知道通过查找某个组合来遍历数字序列的有效算法,例如:

这里有一个给定的序列,我想找到21×73的某个组合的索引,例如

。。。124321947362862188734738

因此,我有一个21×94的模式,需要找出以下索引的位置:

219473

218873

我认为有一种方法可以避免触及每一个数字

编辑: “Lasse V.Karlsen”提出了一个我确实忘记的重要观点。 不允许有重叠,例如

21217373215573


212173是可以的,那么下一个将是215573

似乎您正在寻找
21..73
-
代表“任何字符”1

接下来,您只需要迭代这个正则表达式的所有匹配项

大多数高级语言都已经内置了一个简单易用的正则表达式库

请注意,许多正则表达式库已经为您提供了“无重叠”功能,包括java:

String s = "21217373215573";
Matcher m = Pattern.compile("21..73").matcher(s);
while (m.find()) System.out.println(m.group());
将产生以下所需的输出:

212173
215573


(1) 正如你的问题所暗示的,这首先假设你的序列是由数字组成的。

根据你使用的语言,你可以使用排序为
21\d{2}73
的正则表达式,它将查找
21
,然后是两个数字,然后依次是
73
。C#等语言允许您获取匹配的索引,如图所示

或者,您可以构建自己的,可以是这样的:

string input = ...
int index = 0
while(index < input.length - 5)
    if(input[index] == 2) && (input[index + 1] == 1) && (input[index + 4] == 7) && (input[index + 5] == 3)
        print(index);
        index += 6;
    else index++
字符串输入=。。。
整数索引=0
而(索引<输入长度-5)
如果(输入[索引]==2)&(输入[索引+1]==1)&(输入[索引+4]==7)&(输入[索引+5]==3)
打印(索引);
指数+=6;
其他索引++

由于您不知道这些组合从何处开始,并且您不只是在寻找第一个组合,因此无法不触摸每个数字(可能只是最后n-1个数字,其中n是组合的长度,因为如果数字较少,则空间不足)

我只是不知道更好的方法,然后只是阅读整个序列,因为你们可以有

。。。84452121737338494684

然后有两个重叠的组合。若你们并没有寻找重叠的组合,那个么这只是一个简单的版本,但在你们的例子中是可能的

一些非重叠算法伪代码:

start := -1; i := 0
for each digit in sequence
  if sequence[digit] = combination[i]
    if start = -1 
      start := digit
    endif
    i++
    if i >= length(combination)
      possibleCombinations.add(start)
      start := -1
      i := 0
    endif
  else
    start := -1
  endif
end

这应该是O(n)。与在未排序的数组中查找一个值的复杂性相同。如果您正在寻找像我的示例中那样的重叠组合,那么复杂性会更高,您必须检查每个可能的开始,这会在检查每个找到的开始值的内部添加一个循环。检查组合是否继续,然后保留起始值或在组合中断时丢弃它的东西。然后复杂性将类似于O(n*长度(组合)),因为不能有更多的开始,那么组合的长度是多少。

?(或者我完全误解了你吗?)正则表达式。你懂什么语言?Perl?pythonR?如果要扫描21?94,为什么要标记21?73?字符串“21219494”呢?这里应该出现两次,还是因为重叠而只有一次?@Lasse V.Karlsen:这很重要,我应该在问题中提到。像你提到的那样重叠是不允许的。谢谢。