我有一系列乘客,如下:
Passenger[] passengers = new Passenger[5];
以下是“乘客”的定义:
public class Passenger{
int id;
int fromId;
int toId;
}
我想找到“ to”和“ from”属性匹配的乘客;例如,如果John的fromID = 3,而Jerry的toID = 3,那么我可以将它们放在一起并将它们添加到“ pairedPassengers”的 List 中。我已经有一个O(n ^ 2)解决方案,如下所示,但是更有效的方法是什么?
public class PairedPassengers{
int id1;
int id2;
}
public class MainClass{
public static void main(String[] args){
List<PairedPassengers> pairedPassengers = new ArrayList<PairedPassengers>();
for (int i=0; i<passengers.length(); i++){ //length of the original array with all data
for (int j=i; j<passengers.length(); j++){
if (passengers[i].fromId == passengers[j].toId && passengers[i].toId == passengers[j].fromId){
PairedPassengers pPassengers = new PairedPassengers(); //creating a new object to put pairing passengers into
pPassengers.id1 = passengers[i].id;
pPassengers.id2 = passengers[j].id;
pairedPassengers.add(pPassengers);
}
}
}
}
}
答案 0 :(得分:2)
使用Map
通过其Passenger
字段查找to
。 get
上的put
和HashMap
方法均为O(1)时间,因此该算法的整体复杂度为O(n)。
Map<Integer, Passenger> to = new HashMap<>();
for(Passenger p : passengers) {
to.put(p.toId, p);
}
List<PairedPassengers> paired = new ArrayList<>();
for(Passenger q : passengers) {
Passenger p = to.get(q.fromId);
if(p != null) {
paired.add(new PairedPassengers(p, q));
}
}
您还应该为PairedPassengers
类编写一个合适的构造函数。
我在这里假设每个乘客应该以唯一的方式与另一位乘客配对,因此没有重复的to
或from
字段。如果存在此类重复项,那么您将需要一个Map<Integer, List<Passenger>>
来存储具有每个to
值的乘客列表。在最佳情况下,解决方案仍为O(n)时间,但在最坏情况下,解决方案仍为O(n²),因为可以找到二次对。