首页 > 解决方案 > 什么实现更有效地计算数字样本中的出现次数?

问题描述

我正在编写一个贝叶斯网络,它可以让我诊断(基于最可能的诊断)肿瘤是良性还是恶性。该网络将从大量样本中学习,其中包括一组 10 项医学测试的结果以及诊断结果。这些结果将是离散的,范围从 0 到最大值。

在这种情况下,假设我必须编写一个计数器(int[]样本测试,int[]值),以便计算values[i]样本中的出现tests[i],这是为“样本”类选择的最有效的实现?

目前我已经实现了一个ArrayList<int[]>()。这就是我编程的方式。但是,鉴于我期望获得大约 300 组样本(10 种不同测试+诊断的结果),我一直在寻找实现“样本”类的最有效方法(我称之为“amostra”)。

    public class Amostra implements AmostraInt {
    private ArrayList<int []> dados;

    public Amostra() {
        this.dados = new ArrayList<int []>();
    }

    public int[] count (int[] var, int []val) {
        int i=0;
        int[]ocorre = new int[var.length] ;
        while (i< dados.size()) {
            int j=0;
            while (j<var.length) {
                if (dados.get(i)[var[j]]==val[j])
                    ocorre[j]+=1;
                j++;
            } 
            i++;
            }           
        return ocorre;

标签: javaperformancecounterbayesianbayesian-networks

解决方案


这里有一些小的改进。将 while 循环更改为 for 循环。将多次调用替换为dados.get(i)每次外循环迭代一次。这不会改变速度,因为 JVM 会优化调用,dados.get(i)但它确实使代码看起来更简洁。

我对数据了解得不够多,无法找到替代双循环的方法。本质上看起来需要双循环。

public int[] count(int[] var, int[] val) {
    int[] ocorre = new int[var.length];
    for (int i = 0; i < dados.size(); i++) {
        int[] dado = dados.get(i);
        for (int j = 0; j < var.length; j++) {
            if (dado[var[j]] == val[j]) {
                ocorre[j] += 1;
            }
        }
    }
    return ocorre;
}

推荐阅读