У меня есть списки переменной длины, где каждый элемент может быть одним из четырех уникальных, которые мне нужно использовать в качестве ключей для другого объекта на карте. Предположим, что каждое значение может быть 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
в это дерево будет выглядеть так:
Диаграмма дерева четырехугольников http://episerversucks.com/upload/Diagram1111.png
Серые узлы - это неиспользуемые указатели / узлы. Хотя я беспокоюсь о производительности этой установки, но не будет необходимости иметь дело с коллизиями хешей, и дерево не станет слишком глубоким (в большинстве случаев будут храниться списки с 2-6 элементами, редко более 6).
Есть ли какой-то другой магический способ хранения предметов со списками значений в качестве ключей, которые я пропустил?