Какая реализация более эффективна для подсчета вхождений в числовой выборке? - PullRequest
0 голосов
/ 28 апреля 2018

Я программирую Байесовскую сеть, которая позволит мне диагностировать (основываясь на наиболее вероятном диагнозе) опухоль как доброкачественную или злокачественную. Сеть будет учиться на большом наборе образцов, которые включают результаты набора из 10 медицинских тестов плюс диагноз. Эти результаты будут дискретными, в диапазоне от 0 до максимального значения.

В этом случае, учитывая, что мне придется запрограммировать счетчик (int[] выборочные тесты, int[] значения), чтобы посчитать случаи values[i] в выборках tests[i], что является наиболее эффективную реализацию выбрать для класса «образец»?

В настоящее время я реализовал ArrayList<int[]>(). Так я его запрограммировал. Однако, учитывая, что я ожидаю получить около 300 наборов образцов (результаты 10 различных тестов + диагностика), я искал наиболее эффективный способ реализации класса «Образец» (я назвал его «амостра»).

    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;

1 Ответ

0 голосов
/ 28 апреля 2018

Вот некоторые незначительные улучшения. Изменен цикл 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...