在Trie中引入数据的最佳方式?(c++)

Optimal way to introduce data in a Trie? (C++)

本文关键字:方式 c++ 最佳 Trie 数据      更新时间:2023-10-16

我们正在编写一个解决拼字游戏的程序,整个程序必须在0.1s内执行。我们通过标准输入(耗时0.05s,是我们最大时间的一半)向代码中插入字典。我们使用以下函数将单词添加到字典中,每个单词持续0.1秒:

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(是Boggle的NxN板的尺寸),aux是一个向量,其中来自标准输入的所有数据都被转储。我们施加len>= 3的条件,因为我们只想要包含3个及以上字母的单词。

有什么办法可以提高这些函数的速度吗?

提高这些函数速度的最好方法是对它们运行一个分析器。我不会考虑这样优化代码,直到你运行一个分析器。

话虽如此,我的预测是,如果您运行分析器,您将发现运行时的很大一部分(如90%)将在new Node(*word)中。与您正在执行的其他操作相比,堆分配是缓慢的。多慢?这取决于你的平台,这就是为什么你需要配置文件来找到热点。在一个平台上花费大量时间的事情,在其他平台上可能只花费很少的时间。

运行分析器,确定我的声明是否正确。如果它是正确的,那么我建议池分配节点,以减少必须发生的分配数量。