Фон: Для одного из моих университетских курсов я занимаюсь шахматами. GUI уже завершен с помощью крючков в контроллер, все, что мне нужно - это реализовать объекты. Традиционно я бы просто использовал собственные структуры, подходящие для каждого типа объектов, стек для истории перемещения (отменено, но не повторено), 2d массив/вектор для платы и т. Д. Часть спецификации заключается в том, что мне приходится загружать и сохранить игру в специализированном формате XML, поэтому у меня возникает соблазн просто использовать DOMDocument для хранения игры целиком. Это упростит загрузку и экономию, если у меня есть библиотека, которая реализует операции загрузки/сохранения DOM, потому что мне больше не нужно переводить между XML и моими структурами.Быстрый выбор элементов в DOM
Задача: Скорость. Во всех алгоритмах в шахматы я должен много выбирать по местоположению.
XML Format (неизменяемый):
<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, хотя в основном я ищу идеи, а не фактический код (хотя это было бы полезно).
Рассмотрите случай, когда я вычислил все возможные движения на куске, который мог бы поставить моего короля в шахматы. В дополнение к вычислению нормальной движущейся картины куска, я должен рассчитать препятствия, которые остановили бы его движение, куски, которые он мог бы захватить, и определить, мог ли какой-либо кусок противника захватить короля, если бы этот ход был выбран. Затем я также должен определить, поставит ли этот шаг их короля. Там достаточно вычислений для большой скорости, чтобы иметь значение. Проблема заключается не в количестве частей, сколько в том, сколько раз он называется. –
В соответствии с препятствием скорости: ваше решение не является решением. Я уже знаю, что смогу их сопоставить. Как бы вы справились с этой проблемой? В этом проекте есть больше, чем просто сделать это.Выполнение этого с помощью DOM - это совсем другой проект, чем выполнение его в родных структурах, и поэтому имеет для меня другое значение. –