Шаблоны кодирования в двумерном пространстве (матрица) - PullRequest
1 голос
/ 07 октября 2009

У меня есть двумерная сетка MxN (или матрица). Ячейки в матрице могут содержать целое число. Ячейка с ненулевым целым числом называется заполненной. Набор заполненных ячеек в матрице известен как «конфигурация».

Я хочу предложить алгоритм кодирования или хэширования, который позволит мне однозначно идентифицировать конфигурацию в матрице путем вычисления ее кодированного значения (которое должно генерировать уникальное число).

Я предпочитаю кодирование хэшированию, поскольку столкновения будут совершенно нежелательны.

Может ли кто-нибудь предложить алгоритм кодирования, который я могу использовать для вычисления уникального «id» для данной конфигурации?

Ответы [ 6 ]

1 голос
/ 07 октября 2009

Я бы предложил использовать алгоритм хеширования, который с вероятностью 99.999999999% сгенерирует уникальный идентификатор. В большинстве сценариев допустимо столкновение с каждым миллиардным хешем. Я предлагаю использовать алгоритм CRC , поскольку он генерирует сильно распределенный набор хэшей и имеет относительно низкую частоту столкновений.

0 голосов
/ 07 октября 2009

Неважно, есть ли столкновение или нет. Даже если есть столкновение, вы можете продолжить проверять матрицу int с помощью int, чтобы увидеть, действительно ли она похожа.

Пока коллизии происходят очень редко, накладные расходы составляют 0

так что функция хеширования может быть такой же простой, как сложение всех int. Если этого достаточно, это зависит от возможных значений целочисленных значений и их количества (поэтому, если во всей матрице есть только 1 или 2 ячейки, это хэширование не будет работать)

0 голосов
/ 07 октября 2009

В зависимости от того, какую проблему вы пытаетесь решить, на ум приходит следующее:

  • использовать таблицу соответствия, чтобы связать идентификаторы ширины матриц
  • хранить только значения заполненных полей; их положение в матрице может быть закодировано либо в отдельном значении для каждого поля, либо с использованием растрового изображения для всей матрицы
0 голосов
/ 07 октября 2009

Непонятно, чего вы хотите достичь, но, возможно, пользовательский фильтр Блума может подойти для вашей проблемы.

0 голосов
/ 07 октября 2009

Для представления, которое обеспечивает точное сравнение, невозможно добиться лучшего, чем оптимальное сжатие последовательности битов, которые представляют конфигурацию.

Если вам требуется, чтобы логические значения MxN были уникально закодированы в целое число, вам потребуется 2 M * N значений. Возможно ли это с помощью целых чисел с фиксированной точностью на вашей платформе, зависит от размера M и N; в противном случае вам придется использовать битовую строку или большое целое число.

Поскольку исходными данными является любое целочисленное значение, а не просто 1 или 0, идентификатор наивной цепочки битов наивной матрицы даст сжатие 8 * sizeof ( matrix::cell_type ). Строка битов, оптимизированная для разреженных значений, может быть лучше. Хорошие реализации разреженных цепочек битов сжимают данные, так что это уменьшит пространство хранения представления и позволит быстро и точно сравнивать, что и является требованиями.

Если шаблоны гарантированно разрежены до определенного уровня, существуют способы оптимизации, которые можно выполнить для сжатия информации, но вам нужно предоставить больше информации.

Например, используете ли вы разреженное матричное представление (с полосами, диагональю, сжатые строки и т. Д.) И имеете доступ к внутренним частям хранилища разреженной матрицы, которое естественно и эффективно отобразит сжатую цепочку битов.

Глядя на ваш другой пост, кажется, что матрица используется как сетка для игры, а не как матрица. В этом случае, вероятно, лучше использовать сжатие длин серий для цепочки битов, поскольку это дает другое полезное свойство - закодированное представление цепочек битов матриц, конфигурации которых являются переводами друг друга, будет отличаться только первым значением кодирования.

0 голосов
/ 07 октября 2009

Так что это массив из 1 и 0? Как насчет сжатия RLE или LZW этого массива?

...