Как найти союз между двумя приоритетными очередями? - PullRequest
0 голосов
/ 22 сентября 2018

Я обнаружил пересечение и разницу между двумя приоритетными очередями, но у меня возникают проблемы с выяснением, как найти объединение между ними.Я чувствую, что id мог бы сделать это с массивами, но я изо всех сил пытаюсь найти способ с приоритетными очередями (назначение требует этого)

enter code here   public static PriorityQueue<String> intersection(PriorityQueue<String> q1, PriorityQueue<String> q2){
    PriorityQueue<String> q3 = new PriorityQueue<>();
    for(String string:q1){
        if(q2.contains(string)){
            q3.add(string);
        }
    }
    return q3;
}
enter code here public static PriorityQueue<String> difference(PriorityQueue<String> q1, PriorityQueue<String> intersectionQueue){
    PriorityQueue<String> q3 = new PriorityQueue<>();
    for(String string:q1){
     if(intersectionQueue.contains(string)){

     }else{
         q3.add(string);
     }
    }
    return q3;
}

Я просто ищу здесь подсказки, а не решение, действительно нужнопомощь

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

Предупреждение: Вы применяете семантику 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);
}
0 голосов
/ 22 сентября 2018

Союз?Это относительно просто, верно?Просто добавьте все элементы двух очередей в результирующую очередь.Вот и все.

public static PriorityQueue<String> union(PriorityQueue<String> q1, PriorityQueue<String> q2){
    PriorityQueue<String> q3 = new PriorityQueue<>();
    q3.addAll(q1);
    q3.addAll(q2);
    return q3;
}

Обновление

Если вы не хотите разрешать дубликаты

public static PriorityQueue<String> union(PriorityQueue<String> q1, PriorityQueue<String> q2){
    Set<String> hashSet = new HashSet<>(q1);
    hashSet.addAll(q2);
    return new PriorityQueue<>(hashSet);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...