Каков эффективный способ вычисления игральных костей коэффициент между 900 000 строк?

У меня есть корпус из 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 с другим сечением.

Спасибо за любой совет, который вы можете дать!

8
задан Fred Milton 17 February 2012 в 21:43
поделиться