在Trie中引入数据的最佳方式?(c++)
Optimal way to introduce data in a Trie? (C++)
我们正在编写一个解决拼字游戏的程序,整个程序必须在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)
中。与您正在执行的其他操作相比,堆分配是缓慢的。多慢?这取决于你的平台,这就是为什么你需要配置文件来找到热点。在一个平台上花费大量时间的事情,在其他平台上可能只花费很少的时间。
运行分析器,确定我的声明是否正确。如果它是正确的,那么我建议池分配节点,以减少必须发生的分配数量。
相关文章:
- 如何在c++中为模板函数实例创建快捷方式
- 在c代码之间共享数据的最佳方式
- 在C++中将函数压缩为两种方式
- 以螺旋方式打印矩阵的程序.(工作不好)
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 创建引用向量的优雅方式
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 不同/较旧的处理器运行c++代码的方式是否不同
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 重载方法的方式会在使用临时调用时生成编译器错误
- 在reactor中存储eventHandlers的最佳方式是什么
- 如何以优化的方式同时迭代两个间距不相等的数组
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 为什么C++有不同的变量初始化方式?
- 在AVX通道中混洗的最佳方式
- 如何重新定义MPI_FLOAT,MPI_DOUBLE以 typedef 的方式
- 如何以静态代码分析友好的方式使用 #define 防护?
- 以迭代方式合并标准::unordered_map