如何在两个优先级队列之间找到并集?

时间:2018-09-22 18:45:58

标签: java data-structures

我已经找到两个优先级队列之间的交集和区别,但是我在弄清楚如何找到两个优先级队列之间的联合时遇到了麻烦。我觉得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 :(得分:2)

警告:您正在将Set语义应用于非Set集合对象,因此,如果输入的PriorityQueues包含重复元素,则结果是任意的。

假设它们不存在,另一个问题是您的代码正在使用 O(n) class Album extends Model { use \Staudenmeir\EloquentHasManyDeep\HasRelationships; public function artists() { return $this->hasManyDeep( Artist::class, ['album_musics', Music::class, 'music_artists'] ); } } 方法,因此操作为 O(m * n)

为获得更好的性能,您应该使用真实的Set


包括Collection在内的标准PriorityQueue类都实现了retainAll(c),相当于“集合交集”。该实现使用contains(),因此c.contains(o)应该是HashSet对象,从而产生 O(m + n)性能。

c

包括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对象,从而产生 O(m + n)性能。

HashSet

标准public static PriorityQueue<String> difference(PriorityQueue<String> q1, PriorityQueue<String> intersectionQueue) { PriorityQueue<String> q3 = new PriorityQueue<>(q1); q3.removeAll(new HashSet<>(intersectionQueue)); return q3; } 类都实现addAll(c),等效于“集合并集”。使用Set会导致 O(m + n)性能。

HashSet

答案 1 :(得分:0)

联盟?这比较简单吧?只需将两个队列的所有项目添加到结果队列中即可。就是这样。

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);
}