Я реализую алгоритм, который подразумевает много проверок, находятся ли элементы в наборе / списке. Я использовал std::vector
контейнеры, но время росло экспоненциально по мере роста вектора.
Я решил, что попробую использовать std::set
контейнеры, чтобы не пришлось исследовать весь контейнер, чтобы узнать, содержит ли он определенный элемент.
Я реализовал следующую функцию, которая проверяет, является ли элемент частью данного набора:
bool in_set(set<Node> node_set){
return node_set.find(*this) != node_set.end();
}
Однако эта функция занимает около 2 с для очень маленьких наборов (1-3 элемента), что делает весь мой алгоритм непригодным для использования.
Пользовательский класс, который я использую, выглядит следующим образом:
class Node{
public:
int d;
int h_score;
int coordinates [3];
Node* parent_address;
};
Оператор сравнения, который я реализовал, выглядит следующим образом:
bool operator<(Node other) const{
return concatenate(concatenate(this->coordinates[0], this->coordinates[1]), this->coordinates[2]) <
concatenate(concatenate(other.coordinates[0], other.coordinates[1]), other.coordinates[2]);
}
Edit: функция сцепления, кажется, не занимает много времени при выполнении, она выглядит так:
int concatenate(int i, int j) {
int result = 0;
for (int x = i; x <= j; x++) {
result = result * 10 + x;
}
return result;
}
Знаете ли вы, почему это занимает так много времени и, что более важно, как сделать это быстрее?