Предупреждение: Вы применяете семантику Set к объектам коллекции, отличным от Set, поэтому результаты будут произвольными, если входные значения PriorityQueues содержат повторяющиеся элементы.
Если предположить, что это не так, другая проблемав том, что ваш код использует метод O (n) contains()
, поэтому операция: O (m * n) .
Для повышения производительности выследует использовать реальные Set
.
Стандартные Collection
классы, в том числе PriorityQueue
, все реализации retainAll(c)
, что эквивалентно «заданному пересечению».В реализации используется c.contains(o)
, поэтому c
должен быть объектом HashSet
, в результате чего производительность O (m + n) .
public static PriorityQueue<String> intersection(PriorityQueue<String> q1, PriorityQueue<String> q2) {
PriorityQueue<String> q3 = new PriorityQueue<>(q1);
q3.retainAll(new HashSet<>(q2));
return q3;
}
Стандартные Collection
классы, включая PriorityQueue
, все реализуют removeAll(c)
, что эквивалентно "асимметричной разности наборов".В реализации используется c.contains()
, поэтому c
должен быть HashSet
объектом, в результате чего производительность O (m + n) .
public static PriorityQueue<String> difference(PriorityQueue<String> q1, PriorityQueue<String> intersectionQueue) {
PriorityQueue<String> q3 = new PriorityQueue<>(q1);
q3.removeAll(new HashSet<>(intersectionQueue));
return q3;
}
Стандарт *Все 1050 * классов реализуют addAll(c)
, что эквивалентно «объединению множеств».Использование HashSet
приводит к производительности O (m + n) .
public static PriorityQueue<String> union(PriorityQueue<String> q1, PriorityQueue<String> q2) {
Set<String> set = new HashSet<>(q1);
set.addAll(q2);
return new PriorityQueue<>(set);
}