У меня есть списки переменной длины, где каждый элемент может быть одним из четырех уникальных, которые мне нужно использовать в качестве ключей для другого объекта на карте. Предположим, что каждое значение может быть либо 0, 1, 2 или 3 (это не целое число в моем реальном коде, но намного проще объяснить этот путь), так несколько примеров ключевых списков может быть:Список значений как ключей для карты
[1, 0, 2, 3]
[3, 2, 1]
[1, 0, 0, 1, 1, 3]
[2, 3, 1, 1, 2]
[1, 2]
Так , для повторной итерации: каждый элемент в списке может быть либо 0, 1, 2 или 3, и может быть любое количество элементов в списке.
Мой первый подход состоял в том, чтобы попытаться хешировать содержимое массива, используя встроенный GetHashCode() в .NET, чтобы объединить хэш каждого элемента. Но так как это вернет int, мне придется иметь дело с столкновениями вручную (два одинаковых значения int идентичны словарю).
Итак, мой второй подход состоял в том, чтобы использовать квадратное дерево, разбивая каждый элемент в списке на узел, который имеет четыре указателя (по одному для каждого возможного значения) для следующих четырех возможных значений (с корневым узлом, представляющим []
, пустой список), вставив [1, 0, 2] => Foo
, [1, 3] => Bar
и [1, 0] => Baz
в это дерево будет выглядеть следующим образом:
Quad Tree Diagram http://episerversucks.com/upload/Diagram1111.png
Грэй узлы узлы быть неиспользуемые указатели/узлы. Хотя я беспокоюсь о производительности этой установки, но не будет необходимости иметь дело с хеш-коллизиями, и дерево не станет глубоким (в основном будут списки с 2-6 сохраненными элементами, редко более 6).
Есть ли какой-нибудь другой магический способ хранения элементов со списком значений в качестве ключей, которые я пропустил?
Это не отличает список [0; 1; 2; 3] от списка [1; 2; 3]. – Brian
Вы можете исправить это, установив начальное значение хеша на 1, но вы ограничите себя четырьмя элементами. Это единственный способ, с помощью которого я могу справиться с начальными и конечными нулями.Вы можете настроить его для обработки 15 элементов. – gradbot
@Brian, @gradbot, я забыл о заголовке 0 и изменил свой код, чтобы запустить хэш с 1, чтобы разрешить 14 элементов. Спасибо, что указали это. –