|
|
|
Задачка на собеседовании. Коллекции.
|
|||
|---|---|---|---|
|
#18+
Приветствую, получил вот такую задачку на собеседовании на Java-junior'a, меня немного ввела в ступор тем что просто перебрать не можем, тогда каким образом искать дубликаты? Если не трудно объясните решение данной задачи. Благодарю. Дан класс com.noname.User, модифицировать его не можем. Нужно написать утилитный метод public static List<User> findDuplicates(Collection<User> collA, Collection<User> collB); который возвращает дубликаты: юзеров, которые есть в обеих коллекциях. Одинаковыми считаем юзеров, у которых совпадают все 3 поля: username, email, passwordHash. По производительности: метод findDuplicates должен работать не больше нескольких секунд, если на вход получает 2 коллекции по 100 тысяч элементов в каждой. То есть, простой перебор в цикле не подойдёт. Пользоваться можно только стандартными классами Java SE public final class User { private String username; private String email; private byte[] passwordHash; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public byte[] getPasswordHash() { return passwordHash; } public void setPasswordHash(byte[] passwordHash) { this.passwordHash = passwordHash; } } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2014, 17:22 |
|
||
|
Задачка на собеседовании. Коллекции.
|
|||
|---|---|---|---|
|
#18+
Первое что пришло в голову - перегнать обе коллекции в списки, отсортировать со своим компаратором и проделать нечто вроде сортировки слиянием, но отбрасывая пользователей, которых нет в обоих списках. Второе - преобразовывать юзеров из 1 коллекции в строки (склеить строковые представления всех полей) и запихивать пары строка-юзер в любую Map<String,User>, потом юзеров из 2 коллекции тоже перегонять в строку, смотреть есть ли такой ключ в мапе и если есть, то отдавать в список повторов. Set-ы не предлагаю, ибо что деревянный что хешевый сделаны через отображения, так что отличий от варианта 2 не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2014, 18:01 |
|
||
|
Задачка на собеседовании. Коллекции.
|
|||
|---|---|---|---|
|
#18+
whizzzkey, collA.retainsAll(new HashSet(collB)); а теперь взять исходник retainsAll и if (!c.contains(new _User(it.next()))) и у класса _User написать equal куда передается User ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2014, 18:06 |
|
||
|
Задачка на собеседовании. Коллекции.
|
|||
|---|---|---|---|
|
#18+
Замечания к постановке. 1) Нам уже даны коллекции? Или их нужно наполнять. Во втором случае без перебора всех элементов нам не обойтись. Наполнение коллекции это O(n) сложная задача. 2) Если имплементация коллекции удачно подходит под работу с множествами (объединение вычитание) то можно из первого множества вычесть второе а потом перебрать в первом все кого нет во втором. removeAll(Collection<?> c) 3) Но здесь подвох. Мы совершенно не знаем сколько будет дубликатов. 1 или сто тыщ и производительность операции вывода результата может быть также O(n) что сводит на нет все оптимизации. Вообще здесь нужно препарировать моск товарищу который это адское задание придумал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2014, 19:54 |
|
||
|
Задачка на собеседовании. Коллекции.
|
|||
|---|---|---|---|
|
#18+
Ограничение времени - несколько секунд на 100к юзеров, достаточно почти для всего, что лучше O(n^2). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2014, 20:37 |
|
||
|
Задачка на собеседовании. Коллекции.
|
|||
|---|---|---|---|
|
#18+
Может, еще надо уточнить на каком железе это должно работать? Написал в лоб: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. При 100000 элементов в каждой коллекции затрачивается около 0.3с. Причем сначала ошибся, и вместо set.contains написал collA.contains . Результат был около 4с, что тоже отвечает условиям. collA и collB -- ArrayList ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2014, 20:48 |
|
||
|
Задачка на собеседовании. Коллекции.
|
|||
|---|---|---|---|
|
#18+
Навеяло опечаткой с collA.contains . Похоже, джавадоки-то врут. Про метод TreeSet.contains сказано: джавадокreturns true if and only if this set contains an element e such that (o==null ? e==null : o.equals(e)). Однако для TreeSet c компаратором условие другое: comparator.compareTo(o, e)==0 . И чтобы два раза не вставать. Совсем тупой вложенный цикл по двум коллекциям занял около 220с. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2014, 21:23 |
|
||
|
Задачка на собеседовании. Коллекции.
|
|||
|---|---|---|---|
|
#18+
Автор просил объяснить, между тем видим либо только решения, либо даже критику постановки задачи (для джуниора это недопустимо). Между тем, все достаточно просто. 1) Решение в лоб - вложенный перебор коллеций, сложность O(n 2 ) Допустим, сравнение двух объектов в среднем займет 100 тактов, получаем: 100*100000*100000 = 10 12 тактов, при частоте 3*10 9 получаем порядка 300 секунд, явно не укладываемся в условия. Возможны различные оптимизации, но существенно от O(n 2 ) они не спасут 2) используем знания джуниора о коллекциях. Джуниор должен знать, что для поиска дубликатов хорошо подходят множества, и наиболее эффективный поиск реализован в HashSet (O(1)), что позволит найти дубликаты за время O(n). Можно также использовать TreeSet с временем поиска O(ln(n)), что даст решение со сложностью O(n*ln(n)), но давайте сосредоточимся на первом варианте. Для него нам не хватает методов, которые не были реализованы в изначальном классе: equals() и hashCode(). Решение - унаследовать изначальный класс, либо "обернуть", и там реализовать недостающие методы. Так как изначальный класс объявлен final, остается только возможность обертки: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Далее заполняем 2 множества объектами _User, находим дубликаты, используя операци над множествами, извлекаем из них исходные экземпляры User. Прикинем расходы. Память: Допустим, объект класса _User (указатель на User, поле hash), а также расходы на его хранение в таблице составять порядка 100 байт. Таким образом, для хранения 2 вспомогательных множеств понадобится дополнительная память порядка 2*100*100000 ~ 20 мб Время: Допустим, итерация по исходной коллекции, создание объекта и вычисление хеша потребует порядка 1000 тактов. Тогда для заполнения 2 множеств потребуется 2*1000*100000 = 2*10 8 тактов, при частоте при частоте 3*10 9 получаем меньше 0.1 секунды. Сам поиск займет O(n), тут сложно говорить о величине этого O, но в реальности оно небольшое. Допустим, 10 4 тактов. В этом случае весь поиск займет порядка 10 9 тактов, или меньше секунды. Наиболее тонкий момент тут - написать хорошую хеш-функцию. Используем простые числа, либо берем из какой-нибудь библиотеки, например, apache commons ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2014, 10:33 |
|
||
|
Задачка на собеседовании. Коллекции.
|
|||
|---|---|---|---|
|
#18+
Благодарю всех за ответы! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2014, 12:59 |
|
||
|
Задачка на собеседовании. Коллекции.
|
|||
|---|---|---|---|
|
#18+
Добрый день. Во блин, моя задачка на родной sql.ru попала, приятно :) Вообще, мы ищем синьора. Надо будет с HR поругаться, что вводят соискателей в заблуждение. ivanra предельно точно и полно объяснил решение, и добавить нечего. Или хеш (какой нибудь HashSet + определить методы equals и hashCode), или упорядоченный поиск (TreeSet + кастомный компаратор). Оба решения принимаются. Хотя, если человек предлагает второй вариант (TreeSet), я начинаю относиться к нему с подозрением. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2014, 16:15 |
|
||
|
Задачка на собеседовании. Коллекции.
|
|||
|---|---|---|---|
|
#18+
whizzzkey, автордолжен работать не больше нескольких секунд, -- это интересный критерий ! Ещё никогда о таких подходах не слышал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2014, 17:09 |
|
||
|
Задачка на собеседовании. Коллекции.
|
|||
|---|---|---|---|
|
#18+
Я не спец в этом вопросе. Но вот набрал в поиске: http://goo.gl/zU47xh Верхние два результата авторКубок ОАО ``Концерн ``НПО ``Аврора'' по программированию (что бы это ни значило) Пример задачи Задано целое число n. Требуется найти число различных делителей n. На ввод подается целое число n (1 ≤ n ≤ 109). Следует вывести число различных делителей n. Ограничения по времени: 0.1 сек. Ограничения по памяти: 64 мегабайта.авторПравила Четырнадцатой Всероссийской командной олимпиады школьников по программированию Жюри указывает ограничения на время работы программы на одном тесте и на размер доступной памяти в формулировках задач. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2014, 17:50 |
|
||
|
Задачка на собеседовании. Коллекции.
|
|||
|---|---|---|---|
|
#18+
MasterZivwhizzzkey, автордолжен работать не больше нескольких секунд, -- это интересный критерий ! Ещё никогда о таких подходах не слышал. Там несколько секунд будет ClassLoader будет прогружать деревище классов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2014, 17:53 |
|
||
|
Задачка на собеседовании. Коллекции.
|
|||
|---|---|---|---|
|
#18+
Просто чтобы уточнить - "ищем синьора", но один из критериев - знает ли он хоть что-то о явовских коллекциях? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2014, 18:05 |
|
||
|
Задачка на собеседовании. Коллекции.
|
|||
|---|---|---|---|
|
#18+
Синьор не станет разговаривать на собеседовании о коллекциях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2014, 18:23 |
|
||
|
Задачка на собеседовании. Коллекции.
|
|||
|---|---|---|---|
|
#18+
wstПросто чтобы уточнить - "ищем синьора", но один из критериев - знает ли он хоть что-то о явовских коллекциях? Типа того. Незатратный для меня по времени способ провести первичный отсев. Многие соискатели, даже имеющие в резюме 10+ лет опыта разработки на Java, не справляются с этой детской задачкой на 20 минут (это если ещё и тесты писать). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2014, 18:34 |
|
||
|
Задачка на собеседовании. Коллекции.
|
|||
|---|---|---|---|
|
#18+
mbiz Типа того. Незатратный для меня по времени способ провести первичный отсев. Многие соискатели, даже имеющие в резюме 10+ лет опыта разработки на Java, не справляются с этой детской задачкой на 20 минут (это если ещё и тесты писать). м-да. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2014, 18:45 |
|
||
|
Задачка на собеседовании. Коллекции.
|
|||
|---|---|---|---|
|
#18+
На собеседовании (по JavaScript правда, не по Java) преподаватель вуза или колледжа какого-то который преподавал для студентов веб программирование с многолетним опытом, и убедительным рассказом об опыте работы - не смог написать реализацию метода map :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2014, 21:35 |
|
||
|
Задачка на собеседовании. Коллекции.
|
|||
|---|---|---|---|
|
#18+
maytonСиньор не станет разговаривать на собеседовании о коллекциях.А о чем сеньер будет разговаривать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2014, 22:00 |
|
||
|
Задачка на собеседовании. Коллекции.
|
|||
|---|---|---|---|
|
#18+
cdtyjvmaytonСиньор не станет разговаривать на собеседовании о коллекциях.А о чем сеньер будет разговаривать? Зп, обеды, личный водитель.. все как обычно :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2014, 22:02 |
|
||
|
Задачка на собеседовании. Коллекции.
|
|||
|---|---|---|---|
|
#18+
privatemap :) стесняюсь спросить, что делает метод map? карту гугла показывает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2014, 14:55 |
|
||
|
Задачка на собеседовании. Коллекции.
|
|||
|---|---|---|---|
|
#18+
Поправил немного описание: бла-бла ... у которых совпадают все 3 поля: username, email, passwordHash. Пользоваться можно только стандартными классами Java SE версии не выше 7 (восьмёрку я ещё ниасиливал, да и пока мало она в реальных проектах используется). Алгоритм должен быть реализован более эффективно, чем простой перебор. В качестве приблизительного критерия можно использовать условие, что метод findDuplicates должен работать не больше нескольких секунд, если на вход получает 2 коллекции по 100 тысяч элементов в каждой. Мой вариант решения, поправьте, если он не совершенен :) Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2014, 14:59 |
|
||
|
Задачка на собеседовании. Коллекции.
|
|||
|---|---|---|---|
|
#18+
Из кода можно подчерпнуть много информации помимо собственно правильно/неправильно решил. В код профессионала можно даже не вчитываться, сразу всё понятно просто по форматированию, именованию переменных и другим признакам. И наоборот, если "школьник" перед собеседованием случайно решал аналогичную задачу, и даже выдал правильное решение, код его обязательно выдаст. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2014, 15:06 |
|
||
|
Задачка на собеседовании. Коллекции.
|
|||
|---|---|---|---|
|
#18+
А можно еще увидеть код того самого профессионала? То есть, в числе прочего, человека, способного задуматься что это за пользователи, различающиеся только паролями и что если это не подвох в задаче, а реальное требование, то неплохо бы хоть как-то этот момент прояснить в комментариях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2014, 19:37 |
|
||
|
Задачка на собеседовании. Коллекции.
|
|||
|---|---|---|---|
|
#18+
авторне справляются с этой детской задачкой на 20 минут (это если ещё и тесты писать). ВСЁ ИМХО: я что-то сомневаюсь, что Вы успеете за двадцать минут с ходу сделать. А мы то знаем как подобные здачки появляются на свет. Группа прогеров натыкается на проблему, несколько часов (не постесняюсь, даже дней!) пытаются сделать хоть что-то, потом еще столько же отлаживают, а потом на собеседовании просят за 20 мин. на листе бумаги накодить. Неадекват реально. Понимаю если-б какой нить микрософт или оракл хотя бы такое устраивал, а так ваще! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2014, 23:44 |
|
||
|
|

start [/forum/topic.php?fid=59&startmsg=38703182&tid=2126815]: |
0ms |
get settings: |
10ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
164ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 208ms |
| total: | 445ms |

| 0 / 0 |
