Мы работаем над программой для решения игры Boggle, и вся программа должна быть выполнена менее чем за 0,1 с. Мы вставляем словарь в наш код стандартным вводом (который длится 0,05 с, половина нашего максимального времени). Мы используем следующие функции для добавления слов в словарь, которые длятся 0,1 секунд каждые:Оптимальный способ введения данных в Trie? (C++)
void Node::addWord(const char* word){
const char idx = *word - 'a';
if(!mChildren[idx]) mChildren[idx] = new Node(*word);
if(strlen(word) > 1) mChildren[idx]->addWord(word + 1);
else mChildren[idx]->setMarker(true);
}
void Trie::addDictionary(const vector<string>* aux){
auto length = aux->size();
Node* current = root;
for (size_t i = 0; i < length; i++) {
int len = aux->at(i).length();
if (len >= 3 && len <= DIM*DIM + 1) {
current->addWord(aux->at(i).c_str());
}
}
}
В этом случае, DIM = 4 (размерность платы NxN из Boggle) и всп вектора где все данные со стандартного ввода сбрасываются. Мы накладываем условие len> = 3, потому что нам нужны только слова с 3 буквами и более.
Любые идеи для повышения скорости этих функций?
Передача длины строки в addWord - вызов strlen столько раз, сколько вы делаете, полностью невостребован для – UKMonkey
Использование 'operator []' вместо 'at()' может быть немного быстрее, потому что оно не проверяет -Из-границы. – alain
Вы не только вызываете 'at', который медленнее и избыточен в вашем коде, но делайте это несколько раз. Используйте константу const и цикл диапазона 'for (const auto & word: * aux) {...}'. Вы должны использовать константную ссылку вместо указателя на вектор. – Slava