有没有办法以编程方式检测一组数据中的模式?例如,如果我有以下数据,我怎么发现每第6行重复第一列,第7行重复第二列?
2 3
1 1
5 2
4 5
3 7
2 6
1 3
5 1
4 2
3 5
2 7
实际数据比这复杂得多。我可以使用PHP或Java。是否有图书馆或功能?
答案 0 :(得分:2)
我没有任何好的参考资料,但是对于这些相当简单的模式,你会想做auto correlation。基本上,您可以看到数组与各种增量的相关性。它被定义为+1表示数字完全相关,0表示它们相对于彼此“完全”随机,-1表示它们彼此完全“相反”。
对于delta = 0,您要将数据与自身进行比较,以确保始终存在完美的相关性
在您的情况下,第一列还将显示一个峰值(数字接近1),其delta值为6,第二列的delta值为7.
对于Java,我会查看Apache Commons Math library。
答案 1 :(得分:1)
这是蛮力的方式。我的想法是测试数组的所有子集(第一个元素,然后是前两个元素,然后是前三个元素等等),看看是否有任何子集出现在数组中。
我是当场写的,所以没有保证:)
boolean hasPattern(int[] data) {
ArrayList<Integer> matchList = new ArrayList<Integer>();
for (int i = 0; i < data.length; i++) {
matchList.add(i);
if (matchPattern(data, matchList))
return true;
}
return false;
}
boolean matchPattern(int[] data, ArrayList<Integer> pattern) {
for (int i = 0; i < data.length; i++)
if (data[i] != pattern.get(i % pattern.size())
return false;
return true;
}
答案 2 :(得分:0)
替换&#34; matchList.add(i)&#34;使用&#34; matchList.add(data [i])&#34;然后效果很好:
static boolean hasPattern(int[] data) {
ArrayList<Integer> matchList = new ArrayList<Integer>();
for (int i = 0; i < data.length; i++) {
matchList.add(data[i]);
if (matchPattern(data, matchList))
return true;
}
return false;
}
static boolean matchPattern(int[] data, ArrayList<Integer> pattern) {
for (int i = 0; i < data.length; i++)
if (data[i] != pattern.get(i % pattern.size())) {
return false;
}
return true;
}