我已经找到两个优先级队列之间的交集和区别,但是我在弄清楚如何找到两个优先级队列之间的联合时遇到了麻烦。我觉得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;
}
我只是在寻找提示而不是解决方案,真的需要帮助
答案 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);
}