У меня есть корпус из 900 000 строк. Они различаются по длине, но в среднем содержат около 4500 символов. Мне нужно найти наиболее эффективный способ вычисления коэффициента Dice каждой строки, поскольку он относится к любой другой строке. К сожалению, это приводит к тому, что алгоритм коэффициента Dice используется примерно 810 000 000 000 раз.
Как лучше всего структурировать эту программу для повышения эффективности? Очевидно, я могу запретить вычисление игральных костей разделов A и B, а затем B и A, но это только вдвое уменьшает требуемую работу. Стоит ли мне использовать несколько сокращений или создать какое-то двоичное дерево?
Я использую следующую реализацию алгоритма коэффициента Dice в Java:
public static double diceCoefficient(String s1, String s2) {
Set nx = new HashSet();
Set ny = new HashSet();
for (int i = 0; i < s1.length() - 1; i++) {
char x1 = s1.charAt(i);
char x2 = s1.charAt(i + 1);
String tmp = "" + x1 + x2;
nx.add(tmp);
}
for (int j = 0; j < s2.length() - 1; j++) {
char y1 = s2.charAt(j);
char y2 = s2.charAt(j + 1);
String tmp = "" + y1 + y2;
ny.add(tmp);
}
Set intersection = new HashSet(nx);
intersection.retainAll(ny);
double totcombigrams = intersection.size();
return (2 * totcombigrams) / (nx.size() + ny.size());
}
Моя конечная цель - вывести идентификатор для каждого раздела, в котором есть игральные кости. коэффициент больше 0,9 с другим сечением.
Спасибо за любой совет, который вы можете дать!