Size: a a a

Java/Kotlin and more

2021 March 19

dm

dia mod in Java/Kotlin and more
Evgeniy
В корзине, например, ещё связный список, и элементы ищутся по ключу через их реализацию equals
Я то понимаю, но мне интересно, какой длинны этот список и в чем опасность вообще самой коллизии?
источник

E

Evgeniy in Java/Kotlin and more
dia mod
Я то понимаю, но мне интересно, какой длинны этот список и в чем опасность вообще самой коллизии?
Коллизия это когда два ключа указывают на одну и ту же корзину. Хэш это как адрес дома и подъезд, при этом есть частные дома-коттеджи, где живет только один человек, и есть высотки, чтобы найти конкретного человека, тебе нужно ещё каждую квартиру обойти.

Длина списка зависит от эффективности хэш-функции и количества корзин
источник

C

Cyclone in Java/Kotlin and more
dia mod
Я то понимаю, но мне интересно, какой длинны этот список и в чем опасность вообще самой коллизии?
Теоретически все твои ключи могут хэшкодиться одинаково, тогда все элементы попадут в одну корзину.
Коллизии ухудшают производительность, так как вместо супер быстрого выбора по ключу придётся перебирать по одному элементы в корзине.
источник

dm

dia mod in Java/Kotlin and more
Evgeniy
Коллизия это когда два ключа указывают на одну и ту же корзину. Хэш это как адрес дома и подъезд, при этом есть частные дома-коттеджи, где живет только один человек, и есть высотки, чтобы найти конкретного человека, тебе нужно ещё каждую квартиру обойти.

Длина списка зависит от эффективности хэш-функции и количества корзин
Кажется начинает проясняться, стандартное количество корзин 16, но я хочу уточнить, когда кол-во корзин увеличивается? Когда в каждой из корзине хотяб по одному объекту? И что значит "длинна списка зависит от эффективности хэш-функции", я знаю что хеш Мара увеличивается и потом идёт перераспределение объектов через новый перерасчёт хэша объектов, но не до конца понял это, пояснить можно?
источник

dm

dia mod in Java/Kotlin and more
Cyclone
Теоретически все твои ключи могут хэшкодиться одинаково, тогда все элементы попадут в одну корзину.
Коллизии ухудшают производительность, так как вместо супер быстрого выбора по ключу придётся перебирать по одному элементы в корзине.
И все? ток из-за производительности? Я почему-то считал что есть опасности типо потери этих обьектов
источник

C

Cyclone in Java/Kotlin and more
dia mod
Кажется начинает проясняться, стандартное количество корзин 16, но я хочу уточнить, когда кол-во корзин увеличивается? Когда в каждой из корзине хотяб по одному объекту? И что значит "длинна списка зависит от эффективности хэш-функции", я знаю что хеш Мара увеличивается и потом идёт перераспределение объектов через новый перерасчёт хэша объектов, но не до конца понял это, пояснить можно?
Доки не пробовал почитать? У HashMap есть параметры конструктора - начальное количество корзин и порог увеличения.
источник

dm

dia mod in Java/Kotlin and more
Cyclone
Доки не пробовал почитать? У HashMap есть параметры конструктора - начальное количество корзин и порог увеличения.
Читал, я все это и статьи на Хабре, я просто решил спросить и все уточнить чтоб у меня больше не возникало вопросов
источник

SD

Stepan Damrin in Java/Kotlin and more
dia mod
Читал, я все это и статьи на Хабре, я просто решил спросить и все уточнить чтоб у меня больше не возникало вопросов
https://youtu.be/kk_9md24Ttk
Вот, посмотри, тут нормально объясняют мне кажется
источник

II

Ilya Ilyukou in Java/Kotlin and more
Есть две HashMap как можно быстро проверить на совпадение ключей и получить только совпадающие ключи. Ключи хранятся в виде строк. Map большая.
источник

E

Evgeniy in Java/Kotlin and more
Ilya Ilyukou
Есть две HashMap как можно быстро проверить на совпадение ключей и получить только совпадающие ключи. Ключи хранятся в виде строк. Map большая.
Берёшь мапу с наименьшим количеством элементов и для каждого ключа проверяешь, есть ли такой же в другой мапе. Если есть - пихаешь в список
источник

RS

Ruslan Stelmachenko in Java/Kotlin and more
Если есть Guava, то можно:
Sets.intersection(smallerMap.keySet(), biggerMap.keySet())

он возвращает Set, который будет live view, у которого итератор выполнен как раз по алгоритму из сообщения выше.
источник

AE

Alexandr Emelyanov in Java/Kotlin and more
Ilya Ilyukou
Есть две HashMap как можно быстро проверить на совпадение ключей и получить только совпадающие ключи. Ключи хранятся в виде строк. Map большая.
var intersection = map1.keySet().retainAll(map2.keySet())
источник

AE

Alexandr Emelyanov in Java/Kotlin and more
Ruslan Stelmachenko
Если есть Guava, то можно:
Sets.intersection(smallerMap.keySet(), biggerMap.keySet())

он возвращает Set, который будет live view, у которого итератор выполнен как раз по алгоритму из сообщения выше.
Для таких простых операций тащить гуаву... Когда есть метод в jdk
источник

DS

Dmitry Same in Java/Kotlin and more
Alexandr Emelyanov
Для таких простых операций тащить гуаву... Когда есть метод в jdk
А для разности есть?
источник

RS

Ruslan Stelmachenko in Java/Kotlin and more
что значит "тащить"? я же сказал "если ЕСТЬ". смысл не использовать возможности либы и изобретать постоянно велосипеды, если либа УЖЕ подключена. А если нет, то да, оверхед. Но retainAll уж точно не лучший способ, когда в условиях задачи написано, что мапы БОЛЬШИЕ.
источник

AE

Alexandr Emelyanov in Java/Kotlin and more
Dmitry Same
А для разности есть?
removeAll()
источник

DS

Dmitry Same in Java/Kotlin and more
Спасибо!
источник

AE

Alexandr Emelyanov in Java/Kotlin and more
Ruslan Stelmachenko
что значит "тащить"? я же сказал "если ЕСТЬ". смысл не использовать возможности либы и изобретать постоянно велосипеды, если либа УЖЕ подключена. А если нет, то да, оверхед. Но retainAll уж точно не лучший способ, когда в условиях задачи написано, что мапы БОЛЬШИЕ.
Так гуава быстрее сделает? Сомневаюсь
источник

RS

Ruslan Stelmachenko in Java/Kotlin and more
Я же сказал, что гуава реализована по алогритму, который описал человек сообщением выше.

А для того, чтобы сделать retainAll, нужно сначала map.keySet() добавить в новый HashSet. Если не добавить, то испортишь оригинальную мапу.
источник

RS

Ruslan Stelmachenko in Java/Kotlin and more
Ну т.е. если 2 мапы по миллиону элементов, и 3 совпадающих, то гуава будет намного эффективнее. Особенно по памяти.
источник