2016-11-01 2 views
1

Мы работаем над программой для решения игры 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 буквами и более.

Любые идеи для повышения скорости этих функций?

+1

Передача длины строки в addWord - вызов strlen столько раз, сколько вы делаете, полностью невостребован для – UKMonkey

+0

Использование 'operator []' вместо 'at()' может быть немного быстрее, потому что оно не проверяет -Из-границы. – alain

+0

Вы не только вызываете 'at', который медленнее и избыточен в вашем коде, но делайте это несколько раз. Используйте константу const и цикл диапазона 'for (const auto & word: * aux) {...}'. Вы должны использовать константную ссылку вместо указателя на вектор. – Slava

ответ

2

Лучший способ повысить скорость этой функции - запустить на них профилировщик. Я бы не стал оптимизировать такой код, пока вы не запустили профайлер против него.

Это, как говорится, будет моим прогнозом, что если вы запустите профилировщик, вы обнаружите, что большая часть вашего времени выполнения (например, 90%) будет находиться в new Node(*word). Распределение кучи медленнее по сравнению с другими операциями, которые вы делаете. Как медленно? Это зависит от вашей платформы, поэтому вам нужно профилировать, чтобы найти горячие точки. То, что потребляет большое количество времени на одной платформе, может потреблять очень мало времени на других.

Запустите профилировщик, определите, верно ли мое требование. Если это правильно, я рекомендую пул распределять узлы, чтобы уменьшить количество распределений, которые должны произойти.

+0

Спасибо! Наша проблема заключалась в том, что когда мы сгенерировали узел, вместо того, чтобы предварительно распределить разные возможные дети (максимальное число детей было 26), используя нулевой указатель, мы использовали операцию для изменения размера вектора каждый раз, когда мы вводили новый элемент. Мы изменили операцию изменения размера на статическое объявление вектора и улучшили время от 120 мс до 70 мс. –

 Смежные вопросы

  • Нет связанных вопросов^_^