В настоящее время я отлаживаю свою таблицу транспонирования для механизма шахматного варианта, где фрагменты могут быть размещены (т.е. изначально не на доске). Мне нужно знать, как часто я сталкиваюсь с ключевыми столкновениями. Я сохраняю список штук в каждом индексе таблицы вместе с обычными хэш-данными. Мое простое решение для определения того, равно ли две позиции равны, терпит неудачу при транспозиции, потому что я линейно сравниваю списки двух частей.
Пожалуйста, не указывайте, что я должен хранить по центру, а не по частям. Я должен хранить список предметов из-за уникальной природы плетеных и захваченных частей. Части в этих состояниях похожи на то, что они занимают перекрывающееся и не занимаемое положением местоположение. Посмотрите, как хранятся куски.
// [Piece List]
//
// Contents: The location of the pieces.
// Values 0-63 are board indexes; -2 is dead; -1 is placeable
// Structure: Black pieces are at indexes 0-15
// White pieces are at indexes 16-31
// Within each set of colors the pieces are arranged as following:
// 8 Pawns, 2 Knights, 2 Bishops, 2 Rooks, 1 Queen, 1 King
// Example: piece[15] = 6 means the black king is on board index 6
// piece[29] = -2 means the white rook is dead
char piece[32];
A транспонирование происходит, когда части перемещаются в другом порядке, но конечный результат - это одно и то же положение платы. Например, следующие позиции равны:
1) first rook on A1; second rook on D7
2) first rook on D7; second rook on A1
Ниже приведен неоптимизированный общий алгоритм; а внутренний цикл похож на другую общую проблему, но с добавленным ограничением, что значения в 0-63 будут выполняться только один раз (т.е. только одна часть на квадрат).
for each color:
for each piece type:
are all pieces in the same position, disregarding transpositions?
В результате сравнения НЕ работает из-за транспозиций. Мне нужно, чтобы определить транспозиции как равные и показывать только разные позиции.
bool operator==(const Position &b)
{
for (int i = 0; i < 32; i++)
if (piece[i] != b.piece[i])
return false;
return true;
}
Производительность/память - это соображение, потому что таблица получает более 100 тыс. хитов (где ключи равны) за ход, а в типичной таблице - 1 миллион элементов. Отныне я ищу что-то быстрее, чем копирование и сортировка списков.