以编程方式检测一组数据中的模式?

时间:2012-01-22 02:52:13

标签: java php

有没有办法以编程方式检测一组数据中的模式?例如,如果我有以下数据,我怎么发现每第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。是否有图书馆或功能?

3 个答案:

答案 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;
}