Как я могу получить уникальный идентификатор для 2d массива? - PullRequest
0 голосов
/ 18 ноября 2010

Я хочу получить уникальный идентификатор для двумерного массива.например:

Массив A:

[4,2,3]
[4,5,6]
[7,8,9]

Массив B:

[9,2,3]
[4,5,6]
[1,1,9]

Я хочу, чтобы функция знала, что A <> B без сохранения всего A и всегоБ.

Заранее спасибо

Ответы [ 2 ]

7 голосов
/ 18 ноября 2010

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

В качестве примера простой функции хеширования:

int hash = 17;
for (int i = 0; i < 3; i++) {
  for (int j = 0; j < 3; j++) {
    hash = hash * 31 + array[i, j];
  }
}
return hash;

Теперь, два разных массива будут очень вероятно иметь разные хэши - но они могут не иметь.

Сколько места вы готовы потратить на идентификатор и насколько велико каждое значение в массиве? Чем больше информации вы захотите вставить в идентификатор, тем меньше вероятность получения ложных срабатываний ... пока вы не дойдете до стадии, когда идентификатор будет таким же большим, как массив, и в этот момент вы сможете убедиться, что вы " будет, конечно, нет ложных срабатываний.

0 голосов
/ 18 ноября 2010
 public static long computeHash(int[][] array) {

        final int p = 16777619; 
        long hash = 2166136261l;

        for(int i = 0; i< array.length; i++) {
           for(int j = 0; j < array[i].length; j++) {
               hash = (hash ^ array[i][j] ^ (i * j)) * p; 
           }
        }

        hash += hash << 13;
        hash ^= hash >> 7;
        hash += hash << 3;
        hash ^= hash >> 17;
        hash += hash << 5;

        return hash;

    }

О хэш-функции: здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...