MakarovSuites
Русский
EnglishDeutschРусскийУкраїнськаFrançaisEspañolItalianoPolski
Связь и лицензии

Math

Хеши и корзины

Сортировочный стол: ключи — бумажные бирки, каретка хеширует каждую и бросает в корзину с номером хеша, коллизия — два разных ключа в одной корзине. Хеш — именованная функция: сумма кодов, многочлен с основанием 31, FNV-1a — или равномерный оракул, стоящий за кривой дней рождения. Отредактируй ключ, посмотри вычисление хеша по символам, переверни один бит и сосчитай сдвинувшиеся биты хеша; сравни две функции на одних ключах.

Хеши и корзины — Изображение из программы
Изображение из программы

Что происходит

Двадцать три человека в комнате чаще делят день рождения, чем нет, и та же арифметика задаёт размер хеш-таблицы. Здесь ключи — настоящие строки, а хеш — ИМЕНОВАННАЯ функция: сумма кодов символов, многочлен с основанием 31, FNV-1a — или равномерный оракул, у которого нет ключа вовсе и который стоит за кривой. Каретка на рельсе хеширует бирку и бросает её в корзину с номером-индексом; бирка, упавшая на другую, — коллизия, и оба ключа остаются подсвеченными. Лист считает хеш пробного ключа по символам, переворачивает один бит ключа и считает сдвинувшиеся биты хеша. Три вопроса разведены: коллизии, равномерность (χ² загрузок против n/m, ожидание m − 1) и лавина; гистограмма, ровная на случайных словах, — не приговор функции: дай сумме букв список анаграмм, и все ключи лягут в одну корзину. Ничто из этого — не криптостойкость.

Уравнения модуля
Уравнения
n ключей равномерно по m корзинам
P(хотя бы одна коллизия) = 1 − произведение (1 − i/m),  ТОЧНО:  n = 23, m = 365 -> 0.50729723432398566;  n = 50 -> 0.97037357957798842
ожидаемое число пустых корзин = m·(1 − 1/m)^n  ТОЧНО - а не привычное m·e^(−n/m):  при n = m = 100 они равны 36.603234127322921 и 36.787944, и разница заметна
ключей до первой коллизии в среднем:  sqrt(pi·m/2) + 2/3 = 24.611199639354552 при m = 365 (по подсчёту 24.6767 за 20 000 запусков)
максимальная нагрузка при n = m ведёт себя как ln n / ln ln n - это АСИМПТОТИКА, а не формула: измеренное отношение РАСТЁТ, 1.32 при m = 64, 1.49 при 256, 1.55 при 1024
поэтому она проверяется как двусторонняя оценка и как монотонная тенденция, но никогда не сравнивается с одним числом
измерено по сравнению с точной кривой (по 20 000 запусков):  n = 10 -> 0.11605 против 0.11695;  n = 23 -> 0.50800 против 0.50730;  n = 70 -> 0.99920 против 0.99916
именованные функции от ключа k = c₁c₂…c_n (коды символов), все по модулю 2³²:  сумма: h = Σ c_i;  основание 31: h ← 31·h + c_i;  FNV-1a: h₀ = 2166136261, h ← (h исключающее ИЛИ c_i)·16777619
корзина = h mod m;  равномерный оракул берёт корзину из начального значения генератора и НОМЕРА ключа - самого ключа у него нет
равномерность: χ² = Σ (load_j − n/m)² / (n/m) по m корзинам; равномерная раздача даёт m − 1 ± √(2(m − 1))
лавинный эффект: среднее по ключам от Hamming(h(k), h(k′)) при изменении ОДНОГО бита ключа k; идеальная функция меняет 16 из 32
измерено (начальное значение 20260913, 40 случайных слов по 64 корзинам): FNV-1a 7 коллизий, χ² 46.4, лавинный эффект 14.6;  основание 31: 9, 52.8, 6.2;  сумма: 8, 52.8, 2.05;  оракул: 9, 59.2, без битов
40 анаграмм одного слова при суммировании: 39 коллизий, одна цепочка из 40, χ² = 2520 - сумма не различает порядок букв

Другие эксперименты

К каталогу
Гонка сортировок — Изображение из программы

Math

Гонка сортировок

Три сортировки бегут по одному массиву с одинаковой скоростью в сравнениях, и первой финиширует та, которая спросила меньше. Решает гонку не размер, а беспорядок: на отсортированном входе вставки берут 63 сравнения, а быстрая — 2016.

Ширина и глубина — Изображение из программы

Math

Ширина и глубина

Два одинаковых лабиринта, два обхода, клетка в такт. Слой, на котором ширина нашла клетку, равен кратчайшему пути — это тождество. Глубина не короче никогда, а насколько длиннее — зависит от того, куда идти.

Самый дешёвый путь — Изображение из программы

Math

Самый дешёвый путь

Местность, где шаг стоит цену клетки, в которую входишь, и волна закрытых вершин расходится по ЦЕНЕ, а не по расстоянию. Ползунок кладёт на карту отрицательное ребро, и у него три измеренных участка: права, ошибается, пути нет вовсе.