Я пишу программу, которая оценивает тонны позиций в настольной игре (т. Е. Othello). Представление моего совета - std::vector
. Поскольку такая же позиция может возникать больше времени при обработке, я использую std::set<std::vector>
для хранения проверенных позиций.std :: vector as key в std :: set и std :: unordered_set
В перспективе выступлений я не знаю, если это предпочтительнее использовать std::set
(который работает изначально потому что std::vector
реализует все операторы, необходимые) или std::unordered_set
с хорошей хэширования функции (т.е. boost::hash_range(...)
).
В альтернативе есть ли другие хорошие решения для достижения одной и той же цели? (Может быть, разные представления на борту [наверняка, если имеется] или разные структуры данных?)
EDIT *************************** *********** РЕДАКТИРОВАТЬ
Это псевдо-код для извлечения платы:
enqueue initial board
while queue not empty:
dequeue a board
if board is already examined: //std::set search
continue
put board in examined boards
if board is solved:
print solution
else:
for each possible board that can arise out of this one:
add board to end of queue
Почему бы не вектором векторов? – NathanOliver
Если вы говорите об эффективности, вам нужно измерить, что быстро для вашей проблемы. И 'std :: vector' всегда должен быть кандидатом для сравнения, если это возможно. –
@NathanOliver с проверкой вектора, если эта позиция уже проверена, требует O (n). С помощью набора O (logn) и unsorted_set O (1). Когда n экстремально большой вектор является узким местом –