java - 什么实现更有效地计算数字样本中的出现次数?
问题描述
我正在编写一个贝叶斯网络,它可以让我诊断(基于最可能的诊断)肿瘤是良性还是恶性。该网络将从大量样本中学习,其中包括一组 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;
解决方案
这里有一些小的改进。将 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;
}
推荐阅读
- azure - 使用 Azure 免费试用,当我不是订阅所有者时无法创建资源
- oracle - 某些 Windows 用户无法使用 SQL Developer 看到 Oracle 中的某些表
- sql - 转换为样式为 114 的 varchar 时,datetime 和 datetime2(3) 数据类型之间的输出格式差异
- javascript - 如何在新选项卡中打开页面而不在 vueJs 中单击按钮
- python-3.x - 偏正态分布函数的python优化
- python - 如何为单元测试全局播种 np.random.default_rng
- php - PHP Docblock for Trait 了解父类
- pytorch - RuntimeError:函数 AddmmBackward 返回了无效的渐变
- excel - Vlookup 使用日期
- c# - 使用 sqlite 的 Asp.Net.Core Webapi 应用程序在将其部署到 docker 时无法获取或发布数据