производительность — наиболее эффективная структура для подсчета уникальных слов в файле [C ++]

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

Ключ в том, чтобы сделать это максимально быстрым и эффективным способом.

Старайтесь иметь в виду, что я использую C ++ для написания кода, но я не против чисто теоретического ответа.

Любые рекомендации?

-1

Решение

Вот пример использования cin.

#include <iostream>
#include <string>
#include <map>
using namespace std;

int main() {
string word;
std::map<std::string, int> word_count;

while (std::getline(cin, word, ' ')) {
word_count[word]++;
}

typedef std::map<std::string, int>::iterator iter;
iter end = word_count.end();
for(iter it = word_count.begin(); it != end; ++it) {
cout << it->first << ", count= " << it->second << endl;
}

return 0;
}
1

Другие решения

Я думаю, что вы должны использовать 2 std :: set с некоторыми «1 раз использованными словами» и «запрещенными словами: использовались дважды или более раз».

Итак, есть слово, которое вы обрабатываете: cur_word. Если его есть, только игнорируйте его, в противном случае проверьте, есть ли в нем свойствови_слов, удалите его и добавьте в список запрещенных слов, в противном случае просто добавьте do allow_words.

0

std::unordered_set может быть быстрее, чем std::set (особенно если файл большой).

Хотя вряд ли это будет иметь большое значение — если вы не напишите все остальное крайне плохо, работа будет сильно ограничена вводом / выводом, поэтому большую часть вашей работы следует направить на ускорение ввода / вывода.

Как действовать дальше, вероятно, будет зависеть от целевой ОС. Для Linux быстрое чтение файлов в основном равно mmap, Для Windows, как правило, вы хотите избежать отображения файлов памяти и использовать ReadFile с FILE_FLAG_NO_BUFFERING флаг.

0
По вопросам рекламы [email protected]