Введение
Предположим, у вас есть список пар ключ / значение:
(0,a) (1,b) (2,c)
У вас есть функция, которая вставляет новое значение между двумя текущими парами, и вам нужно дать ей ключ, который сохраняет порядок:
(0,a) (0.5,z) (1,b) (2,c)
Здесь новый ключ был выбран как среднее между средним числом ключей ограничивающих пар.
Проблема в том, что в вашем списке могут быть миллионы вставок. Если все эти вставки расположены близко друг к другу, вы можете получить такие ключи, как 2^(-1000000)
, которые нелегко хранить в любом стандартном или специальном числовом классе.
Проблема
Как разработать систему для генерации ключей, которая:
- Дает правильный результат (больше / меньше, чем) по сравнению со всеми остальными клавишами.
- Занимает только
O(logn)
память (где n - количество элементов в списке).
Мои попытки
- Сначала я попробовал разные классы чисел. Как дроби и даже полиномиум, но я всегда мог найти примеры, когда размер ключа будет расти линейно с количеством вставок.
- Затем я подумал о сохранении указателей для ряда других клавиш и сохранении отношения «меньше / больше, чем», но для этого всегда требуется минимум 1036 * памяти и времени для сравнения.
Дополнительная информация : в идеале алгоритм не должен прерываться при удалении пар из списка.