У меня есть очень специфическая проблема, которую я хочу эффективно решить.
Геометрия определяется V объемами, пронумерованными от 0 до V-1.
Каждый том ограничен различными поверхностями, пронумерованными от 0 до N-1).
Volume | Surfaces
--------------------
Geometry A (V=2, N=7): 0 | [0 3 5 6 2]
1 | [5 4 2 1]
2 | [4 0 1 3 6]
Обратите внимание, что поверхность появится только один раз в объеме .
Кроме того, поверхность находится максимум в 2 объемах геометрии.
Вот проблема:
У меня есть два разных описания одной и той же базовой геометрии, и я хочу найти, какой объем в геометрии A соответствует тому или иному объему в геометрии B. Другими словами, у меня одинаковые N поверхностей, но объем V определяется по-разному.
Вот геометрия B, которая может соответствовать геометрии A выше:
Volume | Surfaces
--------------------
Geometry B (V=2, N=7): 0 | [1 5 4 2]
1 | [3 6 5 0 2]
2 | [0 1 3 6 4]
Учитывая геометрию A и B, я хочу иметь возможность связывать каждый том геометрии A с соответствующим объемом в геометрии B, наиболее эффективно, насколько это возможно.
A 0 1 2
B 1 0 2
Проект решения:
Сортировка каждого массива поверхностей в порядке возрастания или убывания, а затем сортировка каждого тома в соответствии с лексикографическим порядком их поверхностей. Проблема легко и надежно решается таким образом.
Лучшее решение:
Вычисляет быстрый, уникальный хеш для каждого массива, чем сортирует тома после этого хеша. Хеш не должен зависеть от порядка поверхностей в массиве.
Почему я думаю, что хеш может быть хорошим решением?
Взять хеш (Объем) = мин ([Поверхности])
Этот хеш уже имеет не более 1 столкновения, потому что поверхность может появляться только в 2 томах!
Теперь, если я возьму хэш (Громкость) = min ([Поверхности]) + max ([Поверхности]) * N, у меня все еще будет не более 1 столкновения, но вероятность становится очень маленькой, когда много объемов и поверхности.