C++ 在Trie中引入数据的最佳方式?(C+;+;)
我们正在开发一个解决Boggle游戏的程序,整个程序必须在0.1秒内执行。我们通过标准输入(持续0.05秒,是我们最长时间的一半)在代码中插入字典。我们使用以下函数将单词添加到字典中,每次持续0.1秒:C++ 在Trie中引入数据的最佳方式?(C+;+;),c++,boggle,C++,Boggle,我们正在开发一个解决Boggle游戏的程序,整个程序必须在0.1秒内执行。我们通过标准输入(持续0.05秒,是我们最长时间的一半)在代码中插入字典。我们使用以下函数将单词添加到字典中,每次持续0.1秒: void Node::addWord(const char* word){ const char idx = *word - 'a'; if(!mChildren[idx]) mChildren[idx] = new Node(*word); if(strlen(word) >
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());
}
}
}
void节点::addWord(const char*word){
const char idx=*单词-'a';
如果(!mChildren[idx])mChildren[idx]=新节点(*word);
if(strlen(word)>1)mChildren[idx]>addWord(word+1);
else-mChildren[idx]->setMarker(true);
}
void Trie::addDictionary(常量向量*aux){
自动长度=辅助->大小();
节点*当前=根;
对于(大小i=0;iat(i).length();
如果(len>=3&&len addWord(aux->at(i).c_str());
}
}
}
在这种情况下,DIM=4(是Boggle的NxN板的尺寸),aux是一个向量,其中来自标准输入的所有数据都被转储。我们施加len>=3的条件,因为我们只需要包含3个或更多字母的字
关于提高这些函数的速度的任何想法?< p>提高这些函数的速度的最佳方法是在它们上运行一个剖析器。在运行一个剖析器之前,我不会考虑这样的代码优化。 也就是说,我的预测是,如果运行探查器,您将发现运行时的大部分(比如90%)将位于
newnode(*word)
。与您正在执行的其他操作相比,堆分配速度较慢。有多慢?这取决于您的平台,这就是为什么您必须分析以查找热点的原因。在一个平台上花费大量时间的操作在其他平台上花费的时间可能很少
运行探查器,确定我的声明是否正确。如果正确,那么我建议池分配节点以减少必须发生的分配数。将字符串长度传递到addWord-使用
操作符[]而不是at()调用strlen的次数完全不需要
可能会快一点,因为它不会检查越界。您不仅在
处调用,这在代码中是比较慢和冗余的,而且会多次调用。使用const reference和range loopfor(const auto&word:*aux){…}
。您应该使用常量引用,而不是指向向量的指针。如果(len>=3&&len)您在
使用在安全位置执行绑定检查的,并且在不安全位置使用[]
(因为输入数据可能具有无效字符),则可以删除:/谢谢!我们的问题是,在生成节点时,没有预先分配不同的可能子节点(子节点的最大数量为26个),使用空指针,每次引入新元素时,我们都使用一个操作来调整向量大小。我们将调整大小操作更改为向量的静态声明,并将时间从120ms改进为70ms。