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)*,您也可以看看这个