Algorithm 模式查找算法

Algorithm 模式查找算法,algorithm,Algorithm,我想写一个能够检测任何模式并确定下一个元素的算法。一些示例是112221,其中下一个元素是1 但它也可能是31113311133111(1x3,4x1,3x3,3x1,3x3,3x3,4x1)下一个元素是3 所以总是这样:31113131131131131131131131131131311311311311311311311311311311311311311311 我们不知道该模式有多长,但我们知道它在数组中至少出现一次。我们还知道只有一种模式,而且100%都在阵列内部 将数字想象成颜色可能

我想写一个能够检测任何模式并确定下一个元素的算法。一些示例是
112221
,其中下一个元素是1

但它也可能是
31113311133111(1x3,4x1,3x3,3x1,3x3,3x3,4x1)
下一个元素是3

所以总是这样:
31113131131131131131131131131131311311311311311311311311311311311311311311

我们不知道该模式有多长,但我们知道它在数组中至少出现一次。我们还知道只有一种模式,而且100%都在阵列内部

将数字想象成颜色可能会很有用,阵列将是一面墙上有重复的墙纸。因此,我们的任务是确定如果墙继续存在,墙会是什么颜色


如何开始?

只要阵列始终在整个阵列中重复,您就可以从阵列的开始到结束开始测试长度递增的阵列,在出现故障时移动到下一个更高的长度,直到检查完整个阵列,返回最短的成功阵列

类似于以下(未经测试的)JavaScript代码:

var findShortestRepeatingPattern = function(array){
  var pattern = [];

  for(var patternLength = 0; patternLength < array.length; length++){
    pattern = []
    var arrayCursor = 0;

    //Build the pattern from the start of the array
    while(arrayCursor < patternLength){
      pattern.push(array[arrayCursor++]);
    }

    //Test the pattern on the remainder of the array
    var patternMatches = true;
    while(arrayCursor < array.length){
      if(pattern[arrayCursor % patternLength] != array[arrayCursor++]){
        patternMatches = false;
        break;
      }
    }

    //Exit if the pattern matches
    if(patternMatches){
      break;
    }
  }

  return pattern;
};
var findShortestRepeatingPattern=函数(数组){
var模式=[];
对于(var patternLength=0;patternLength

然后,下一个期望值应该是索引insertIndex mod patternLength处的patternValue。

只要阵列始终在整个阵列中重复,就可以从阵列的开始到结束开始测试长度递增的阵列,故障时移动到下一个更高的长度,直到检查完整个阵列,返回最短的成功模式

类似于以下(未经测试的)JavaScript代码:

var findShortestRepeatingPattern = function(array){
  var pattern = [];

  for(var patternLength = 0; patternLength < array.length; length++){
    pattern = []
    var arrayCursor = 0;

    //Build the pattern from the start of the array
    while(arrayCursor < patternLength){
      pattern.push(array[arrayCursor++]);
    }

    //Test the pattern on the remainder of the array
    var patternMatches = true;
    while(arrayCursor < array.length){
      if(pattern[arrayCursor % patternLength] != array[arrayCursor++]){
        patternMatches = false;
        break;
      }
    }

    //Exit if the pattern matches
    if(patternMatches){
      break;
    }
  }

  return pattern;
};
var findShortestRepeatingPattern=函数(数组){
var模式=[];
对于(var patternLength=0;patternLength

然后,下一个期望值应该是索引insertIndex mod patternLength处的patternValue。

您可以搜索字符串中其他任何位置可以找到的最长后缀。而不是简单地在另一个位置添加位于后缀后面的字符

范例 311113311

我们可以在序列的其他位置(而不是末尾)添加以下后缀

所以最长的后缀是
311
,然后是
3

3 1 1 1 1 3 3 3 1 1 1 3 3 3 1 1 1 1  
xxxxxxxxx ^

因此,下一个字符的估计规则是
3

,您可以搜索字符串中其他任何位置可以找到的最长后缀。而不是简单地在另一个位置添加位于后缀后面的字符

范例 311113311

我们可以在序列的其他位置(而不是末尾)添加以下后缀

所以最长的后缀是
311
,然后是
3

3 1 1 1 1 3 3 3 1 1 1 3 3 3 1 1 1 1  
xxxxxxxxx ^

因此,下一个字符的估计规则是
3

,这个问题通常无法解决,因为无法定义“作为模式”。因此,您需要指定要检测的模式类型。例如,我可以建议您阅读正则表达式和上下文无关语言。对于第一个例子,它是一种rational语言,它的正则表达式可以是(1122)*您也可以看看,这个问题通常无法解决,因为不能定义“作为模式”。因此,您需要指定要检测的模式类型。例如,我可以建议您阅读正则表达式和上下文无关语言。对于第一个例子,它是一种rational语言,其正则表达式可以是(1122)*,您也可以看看这个