从文件中读取并有效地向树中添加单词

时间:2016-11-02 12:25:43

标签: c++ readfile trie

我有一个文件作为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个字组成。

有关如何优化/降低复杂性/改进代码的任何想法?谢谢!

1 个答案:

答案 0 :(得分:1)

你的问题没有提到你对该载体有任何其他用途。

首先将〜180,000行读入一个向量,然后在向量上迭代,这将浪费大量时间和内存,因为没有明显的增值。

您应该将单词插入到trie中,作为阅读它们的一部分。

 string word;

 while(getline(cin, word){
  if(word.length() >= 3 && word.length() <= 17){
    root->addString(word.c_str());
  }
 }