Size: a a a

cxx.Дискуссионная

2020 August 13

/dev/urandon ¯\_(ツ)_... in cxx.Дискуссионная
Cool Cooler
Ну значит, что память выделена, а в ней пусто (или мусор)
Хешмапа это вообще структура данных с вероятностными свойствами. Оценивать её надо опять же имея какие-то предположения на распределение данных
источник

VK

Vitaliy ◀️TriΔng3l▶️... in cxx.Дискуссионная
(Есть ещё варианты с подкручиванием хеша одинаковым образом при вставке и поиске в случае коллизии и выбором другой ячейки, но суть примерно та же)
источник

/dev/urandon ¯\_(ツ)_... in cxx.Дискуссионная
Она вроде хороша в "среднем" случае, и надо проследить, чтобы паттерн данных этому соответвовал
источник

CC

Cool Cooler in cxx.Дискуссионная
Vitaliy ◀️TriΔng3l▶️ Kuzmin
Берётся от ключа хеш, по кусочку этого хеша выбирается ячейка
А я правильно понимаю, что пустая unordered_map занимает как минимум sizeof(void*) * (количество возможных хешей) байт?
источник

/dev/urandon ¯\_(ツ)_... in cxx.Дискуссионная
Чтобы последовательность хеш-функции от данных была примерно равномерна
источник

/dev/urandon ¯\_(ツ)_... in cxx.Дискуссионная
load_factor надо тоже подбирать, количество бакетов тоже
источник

/dev/urandon ¯\_(ツ)_... in cxx.Дискуссионная
Доходило до того, что нейронку учили определять распределение данных, чтобы подкручивать хеш-функцию, и это работает
источник

VK

Vitaliy ◀️TriΔng3l▶️... in cxx.Дискуссионная
Cool Cooler
А я правильно понимаю, что пустая unordered_map занимает как минимум sizeof(void*) * (количество возможных хешей) байт?
От хеш-функции, которая обычно size_t, берётся только несколько бит, чтобы ячеек было чуть больше, чем сейчас элементов
источник

CC

Cool Cooler in cxx.Дискуссионная
Vitaliy ◀️TriΔng3l▶️ Kuzmin
От хеш-функции, которая обычно size_t, берётся только несколько бит, чтобы ячеек было чуть больше, чем сейчас элементов
А количество ячеек динамическое?
источник

/dev/urandon ¯\_(ツ)_... in cxx.Дискуссионная
Cool Cooler
А количество ячеек динамическое?
Да
источник

CC

Cool Cooler in cxx.Дискуссионная
Аааа, кажется, я таки понял, как работает unordered_map
источник

/dev/urandon ¯\_(ツ)_... in cxx.Дискуссионная
И есть процедура рехешинга, которая заново делает бакеты
источник

VK

Vitaliy ◀️TriΔng3l▶️... in cxx.Дискуссионная
Cool Cooler
А количество ячеек динамическое?
Но при расширении хеши считаются заново, то есть, вставляются в новую таблицу все элементы из старой по одному
источник

CC

Cool Cooler in cxx.Дискуссионная
Vitaliy ◀️TriΔng3l▶️ Kuzmin
Но при расширении хеши считаются заново, то есть, вставляются в новую таблицу все элементы из старой по одному
А это зачем?
источник

CC

Cool Cooler in cxx.Дискуссионная
Прост оставить их в старых ячейках и всё, не?
источник

VK

Vitaliy ◀️TriΔng3l▶️... in cxx.Дискуссионная
Cool Cooler
Прост оставить их в старых ячейках и всё, не?
Если у тебя в старой таблице (с ёмкостью 8) хеш у ключа был 101, а в новой (с ёмкостью 16) 1101, то в новой ты по хешу 101 его не найдёшь
источник

M

M_O_D_E_R in cxx.Дискуссионная
GNU/Плюшка
g++ юзай
Ок, буду пробовать, спасибо
источник

IL

Ilya L in cxx.Дискуссионная
Cool Cooler
Аааа, кажется, я таки понял, как работает unordered_map
Но лучше прочитай что такое хэш-мапы
источник

CC

Cool Cooler in cxx.Дискуссионная
Vitaliy ◀️TriΔng3l▶️ Kuzmin
Если у тебя в старой таблице (с ёмкостью 8) хеш у ключа был 101, а в новой (с ёмкостью 16) 1101, то в новой ты по хешу 101 его не найдёшь
А, примерно понятна проблема
источник

/dev/urandon ¯\_(ツ)_... in cxx.Дискуссионная
Cool Cooler
Прост оставить их в старых ячейках и всё, не?
Есть foo и bar,

hash(foo) = 88005553535
hash(bar) = 225

Сначала у тебя 10 бакетов.

hash(foo) % 10 = 5
hash(bar) % 10 = 5

Теперь у тебя 100 бакетов

hash(foo) % 10 = 35
hash(bar) % 10 = 25

Ты не можешь и дальше foo и bar держать в одной корзине
источник