下午好,我决定学习算法并完成书中的任务,但是我被这个任务打破了条件
Имеется n пользователей, каждому из них соответствует список email-ов (всего у всех пользователей m email-ов).
Например:
user1 -> xxx@ya.ru, foo@gmail.com, lol@mail.ru
user2 -> foo@gmail.com, ups@pisem.net
user3 -> xyz@pisem.net, vasya@pupkin.com
user4 -> ups@pisem.net, aaa@bbb.ru
user5 -> xyz@pisem.net
Считается, что если у двух пользователей есть общий email, значит это один и тот же пользователь. Требуется построить
и реализовать алгоритм, выполняющий слияние пользователей. На выходе должен быть список пользователей с их email-ами (такой же как на входе).
Возможный ответ на задачу в указанном примере:
user1 -> xxx@ya.ru, foo@gmail.com, lol@mail.ru, ups@pisem.net, aaa@bbb.ru
user3 -> xyz@pisem.net, vasya@pupkin.com
условие требует решения за ,близкое к линейному время
看起来很简单,我写了这样的东西
public class User {
private String mName;
private List<String> mAdress;
public User(String mName,List<String>mAdress) {
this.mName=mName;
this.mAdress = mAdress;
}
public List<String> getmAdress() {
return mAdress;
}
public void setmAdress(List<String> mAdress) {
this.mAdress = mAdress;
}
public String getmName() {
return mName;
}
public void setmName(String mName) {
this.mName = mName;
}
}
public class Main {
public static void main(String[] args) {
ArrayList arrayList = new ArrayList();
arrayList.add("asnjvkn@mail.ru");
arrayList.add("sfaf@mail.ru");
arrayList.add("asnjvkn@mail.ru");
arrayList.add("asnjvkn@mail.ru");
arrayList.add("cxv@mail.ru");
arrayList.add("asnjvkn@mail.ru");
arrayList.add("vxcv@mail.ru");
User user = new User("user1",arrayList);
ArrayList arrayList2 = new ArrayList();
arrayList2.add("cxz@mail.ru");
arrayList2.add("sfaxzvzf@mail.ru");
arrayList2.add("asnjvkn@mail.ru");
arrayList2.add("xv@mail.ru");
arrayList2.add("cxv@mail.ru");
arrayList2.add("asnjvkn@mvxail.ru");
arrayList2.add("vxzvcv@mail.ru");
User user2 = new User("user2",arrayList2);
ArrayList arrayList3 = new ArrayList();
arrayList3.add("sd@mail.ru");
arrayList3.add("sfsdvaxzvzf@mail.ru");
arrayList3.add("vd@mail.ru");
arrayList3.add("xv@mail.ru");
arrayList3.add("dsdvvs@mail.ru");
arrayList3.add("asnjvkn@mvxail.ru");
arrayList3.add("vxzvcv@mail.ru");
User user3 = new User("user3",arrayList3);
List<User> userList = new ArrayList<>();
userList.add(user);
userList.add(user2);
userList.add(user3);
userIdentification(userList);
}
public static void userIdentification(List<User> userList){
List<User> identifiedUser = new ArrayList<>();
for (User singleUser: userList){
for (int i = 0; i<singleUser.getmAdress().size();i++){
for(User idenUser: identifiedUser){
if (idenUser.getmAdress().contains(singleUser.getmAdress().get(i))){
System.out.println("true");
}else{
System.out.println("false");
}
}
}
}
}
}
但是这种情况需要在接近线性的时间内解决我的脑袋,告诉我如何实现这个
哈利建议的正确答案
原始答案
要存储电子邮件,请使用集合,例如
Set
然后是这样的(伪代码)
Collection.disjoint
用户的简单枚举是O(n),可以认为是一个下界。然后,对于主循环的每次迭代,在最坏的情况下,迭代顺序增加的输出列表,即 {O(1), O(2), O(3)...,O(n)}。总的来说,这个算法的边界是 O(n*log(n))。我承认每个用户的处理可以减少到 O(1),但我不知道如何实现这一点。我没有考虑比较两个集合的操作的复杂性,因为我不知道它的实现。
只需要知道集合: