Фон: Для одного из моих университетских курсов я занимаюсь шахматами. GUI уже закончен с подключениями к контроллеру, все, что мне нужно сделать, это реализовать объекты. Традиционно я просто использовал бы собственные структуры, подходящие для каждого типа объектов, стек для истории перемещений (поддерживается отмена, но не повтор), 2d массив / вектор для доски и т. Д. Часть спецификации заключается в том, что мне нужно загрузить и сохранить игру в специализированном формате XML, поэтому мне хочется просто использовать DOMDocument для хранения игры целиком. Это сделало бы загрузку и сохранение чрезвычайно легкими, если бы у меня была библиотека, которая реализует действия загрузки / сохранения DOM, потому что мне больше не нужно переводить между XML и моими структурами.
Проблема: Скорость. Во всех алгоритмах в шахматах мне приходится много выбирать по локациям.
Формат XML (неизменяемый):
<board>
<piece type="rook" color="white" column="0" row="7"/>
<piece type="knight" color="white" column="1" row="7"/>
<piece type="bishop" color="white" column="2" row="7"/>
<piece type="queen" color="white" column="3" row="7"/>
<piece type="king" color="white" column="4" row="7"/>
<piece type="bishop" color="white" column="5" row="7"/>
<piece type="knight" color="white" column="6" row="7"/>
<piece type="rook" color="white" column="7" row="7"/>
<piece color="white" column="3" row="6" type="pawn"/>
<piece row="6" type="pawn" color="white" column="4" />
</board>
Теперь я должен получить все элементы фигуры и отфильтровать атрибуты, операция O (n). В реализации массива / вектора я могу легко достичь времени O (1), потому что это простая индексация. Цена O (n) слишком высока, особенно при обнаружении патовой ситуации.
Как бы вы улучшили скорость? Я в основном ищу способы индексирования DOM. У меня были некоторые идеи, но как бы вы решили эту проблему?
Для справки, я занимаюсь разработкой на C ++ и, вероятно, буду использовать библиотеку Xerces для XML, хотя я в основном ищу идеи, а не реальный код (хотя это было бы полезно) .