Какова основная идея реализации разреженной хэш-таблицы?

Почему библиотека с открытым исходным кодом Google sparsehash имеет две реализации: плотную хэш-таблицу и разреженную?

2 ответов


плотная хэш-таблица - это ваша обычная реализация хэш-таблицы учебника.

разреженная хэш-таблица хранит только элементы, которые были фактически установлены, разделенные на несколько массивов. Цитата из комментарии при реализации разреженных таблиц:

// The idea is that a table with (logically) t buckets is divided
// into t/M *groups* of M buckets each.  (M is a constant set in
// GROUP_SIZE for efficiency.)  Each group is stored sparsely.
// Thus, inserting into the table causes some array to grow, which is
// slow but still constant time.  Lookup involves doing a
// logical-position-to-sparse-position lookup, which is also slow but
// constant time.  The larger M is, the slower these operations are
// but the less overhead (slightly).

чтобы узнать, какие элементы массивов установлены, разреженная таблица включает растровое изображение:

// To store the sparse array, we store a bitmap B, where B[i] = 1 iff
// bucket i is non-empty.  Then to look up bucket i we really look up
// array[# of 1s before i in B].  This is constant time for fixed M.

Так что каждый элемент несет накладные расходы всего 1 бит (в предел.)


sparsehash-это эффективный для памяти способ сопоставления ключей со значениями (1-2 бита на ключ). Фильтры Bloom могут дать вам еще меньше бит на ключ, но они не прикрепляют значения к ключам, кроме outside/probably-inside, что немного меньше, чем бит информации.