我有一个文件作为Command Arguments的输入。我这样读了每一行:
vector<string> filewords;
string line;
while(getline(cin, line){
filewords.push_back(line);
}
我还没有找到任何其他方法从文件中获取字符串,如果我可以将整个内容放在一个非常好的超级字符串中,但我还没有找到
我以这种方式将单词添加到trie中:
for(const auto &word : *filewords){
if(word.length() >= 3 && word.length() <= 17){
root->addString(word.c_str());
}
}
在将它添加到trie之前,我需要检查每一行是否有一定的长度。 addString是:
void Node::addString(const char* word)
{
if(!mChildren[*word - 'a']) mChildren[*word - 'a'] = new Node(word);
if(word[1]) mChildren[*word - 'a']->addString(word + 1);
else mChildren[*word - 'a']->setMarker(true);
}
孩子们按字母顺序排列,以便&#39; a&#39;在0位,依此类推。
Node是一个具有以下构造函数的类:
Node::Node(const char* a)
{
mContent = *a;
mChildren.resize(26);
}
最多26个孩子(字母表中有26个字母)
我不确定我做过的小优化(制作大小为26的mChildren,将每一行添加到一个向量然后迭代这个向量......)实际上是值得的,或者如果有& #39;更好的方式。
我吩咐让这个程序的部分持续约80ms,而现在需要约120ms,文件由~180.000个字组成。
有关如何优化/降低复杂性/改进代码的任何想法?谢谢!
答案 0 :(得分:1)
你的问题没有提到你对该载体有任何其他用途。
首先将〜180,000行读入一个向量,然后在向量上迭代,这将浪费大量时间和内存,因为没有明显的增值。
您应该将单词插入到trie中,作为阅读它们的一部分。
string word;
while(getline(cin, word){
if(word.length() >= 3 && word.length() <= 17){
root->addString(word.c_str());
}
}