【问题标题】:Algorithm for traveling through a sequence of digits遍历数字序列的算法
【发布时间】:2015-03-12 18:09:18
【问题描述】:

有没有人知道通过寻找某种组合来遍历数字序列的有效算法,例如:

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

... 124321947362862188734738 ...

所以我有一个模式 21??94 并且需要找出索引在哪里:

219473

218873

我认为有办法不触及每个数字。

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

21217373215573

212173 没问题,接下来就是215573

【问题讨论】:

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

标签: algorithm


【解决方案1】:

似乎您正在寻找 regular expression 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) 正如您的问题所暗示的那样,这首先假设您的序列是数字的。

【讨论】:

    【解决方案2】:

    根据您使用的语言,您可以使用21\d{2}73 类型的正则表达式,它将查找21,后跟两位数字,然后是73。 C#等语言允许获取匹配的索引,如图here

    或者,您可以构建自己的Final State Machine,这可能是这样的:

    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++
    

    【讨论】:

      【解决方案3】:

      由于您不知道这些组合从哪里开始,而且您不只是在寻找第一个,因此无法不触摸每个数字(可能只是最后 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*length(combination)),因为不能有更多的开始,那么组合的长度是多少。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-26
        • 1970-01-01
        • 1970-01-01
        • 2011-11-08
        • 1970-01-01
        • 2022-10-19
        • 1970-01-01
        相关资源
        最近更新 更多