有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

有没有一种方法可以通过编程在一组数据中检测模式?例如,如果我有以下数据,我如何发现第一列每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) 个答案

  1. # 1 楼答案

    我手头没有什么好的参考资料,但是对于这些相当简单的模式,您可能需要执行auto correlation。基本上,您可以看到数组本身与各种delta之间的关联有多好。定义为+1表示数字完全相关,0表示它们彼此“完全”随机,而-1表示它们彼此完全“相反”

    对于delta=0,您将数据与自身进行比较,因为始终存在完美的相关性

    在您的例子中,第一列还将显示一个峰值(接近1的数字),其增量为6,第二列的增量为7

    对于Java,我要检查Apache Commons Math library

  2. # 2 楼答案

    这是暴力的方式。其思想是测试数组的所有子集(第一个元素,然后是前两个元素,然后是前三个元素,等等)并查看其中是否有任何一个在数组中显示为模式

    我是当场写的,所以不能保证:)

    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;
    }
    
  3. # 3 楼答案

    matchList.add(i)替换为matchList.add(data[i]),这样效果会更好:

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