2016-11-02 9 views
0

У меня есть файл в качестве входных данных из Аргументов команд. Я читаю каждой строке так:Читать из файла и эффективно добавлять слова в дерево

vector<string> filewords; 
    string line; 
    while(getline(cin, line){ 
     filewords.push_back(line); 
    } 

я не нашел никакого другого способа получить строки из файла, если я мог бы получить содержание целого в мега-строки, было бы здорово, но я гавань «т нашел, как

добавить слова к синтаксическому дереву таким образом:

for(const auto &word : *filewords){ 
     if(word.length() >= 3 && word.length() <= 17){ 
     root->addString(word.c_str()); 
     } 
    } 

Мне нужно, чтобы проверить, что каждая линия имеет определенную длину, прежде чем добавить в синтаксическое дерево. 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); 
} 

дети упорядочены по алфавиту, так «а» находится в положении 0 и так далее.

Узел представляет собой класс со следующим конструктором:

Node::Node(const char* a) 
{ 
    mContent = *a; 
    mChildren.resize(26); 
} 

Там будет не более 26 детей (26 букв в алфавите)

Я не уверен, если маленькие оптимизации я сделал (делая mChildren размером 26, добавляя каждую строку к вектору, а затем итерируя через этот вектор ...) на самом деле стоит того, или если есть лучший способ.

Я предполагаю, что эта часть программы продлится ~ 80 мс, и сейчас требуется ~ 120 мс с файлом, состоящим из ~ 180 000 слов.

Любые идеи о том, как оптимизировать/уменьшить сложность/улучшить код? Благодаря!

+0

Как вы измеряете время? Вы пытались измерить или профилировать различные части кода, чтобы узнать, где узкие места? И если вы проверите [ссылку с хорошим исходным потоком] (http://en.cppreference.com/w/cpp/io/basic_istream), вы можете найти некоторый метод [чтения больших фрагментов] (http: //en.cppreference. ком/ж/CPP/И.О./basic_istream/чтения). –

+0

Также вы знаете, что 'std :: getline' читает целую строку * ни одного слова? Это будет работать, только если каждая строка является одним словом. –

+0

Забыл упомянуть, извините, каждая ильна - это всегда слово. Я не могу использовать ссылку на другой входной поток, кроме cin, потому что имя файла находится в аргументах команды. Что касается времени, я ставлю часы до и после этих операций и получаю разницу. Я понятия не имею, куда поместить часы во внутренние функции, так как они будут исполнены 180000 раз. Благодаря! – Ane

ответ

1

В вашем вопросе не упоминается, что у вас есть какое-либо другое использование для этого вектора.

Чтение ~ 180 000 строк в вектор сначала, а затем итерация по вектору впоследствии, будет тратить много времени и памяти, без видимой добавленной стоимости.

Вы должны просто вставить свои слова в trie, как часть их чтения.

string word; 

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

Я обнаружил, что по этой причине это быстрее. Спасибо, в любом случае! – Ane

 Смежные вопросы

  • Нет связанных вопросов^_^