Поиск HashSet для любого элемента в массиве строк - PullRequest
2 голосов
/ 01 февраля 2011

У меня есть HashSet строк и массив строк.Я хочу выяснить, существует ли какой-либо из элементов в массиве в HashSet.У меня есть следующий код, который работает, но я чувствую, что это можно сделать быстрее.

public static boolean check(HashSet<String> group, String elements[]){
    for(int i = 0; i < elements.length; i++){
        if(group.contains(elements[i]))
            return true;
    }
    return false;
}

Спасибо.

Ответы [ 5 ]

3 голосов
/ 01 февраля 2011

Это O (n) в этом случае (используется массив), оно не может быть быстрее.

Если вы просто хотите сделать код чище:

 return !Collections.disjoint(group, Arrays.asList(elements));
2 голосов
/ 01 февраля 2011

Это кажется несколько разумным. HashSet имеет O (1) (обычно) contains(), так как он просто должен хэшировать строку, которую вы ему даете, чтобы найти индекс, и там есть что-то или нет.

Если вам нужно проверить каждый элемент в вашем массиве, просто не существует более быстрого способа сделать это (последовательно, конечно).

1 голос
/ 01 февраля 2011

... но я чувствую, что это можно сделать быстрее.

Я не думаю, что есть более быстрый способ. Ваш код в среднем равен O(N), где N - количество строк в массиве. Я не думаю, что вы можете улучшить это.

0 голосов
/ 01 февраля 2011

Если вы знаете, что набор является отсортированным набором, и что массив отсортирован, вы можете получить интервальный набор от начала до конца, что, возможно, будет лучше, чем O (| array | *время доступа (установлено)), что особенно важно для отрицательных результатов, превосходящих O (| array |), но если вы хэшируете, вы не сможете.

0 голосов
/ 01 февраля 2011

Как уже говорили другие, самая медленная часть алгоритма выполняет итерации по каждому элементу массива. Единственный способ сделать это быстрее - это знать заранее некоторую информацию о содержимом массива, что позволит вам пропускать определенные элементы, например, если массив отсортирован и имеет дубликаты в известных позициях или что-то в этом роде. Если ввод по сути случайный, то вы не можете многое сделать.

...