Я все еще работаю над проблемой, упомянутой в этом сообщении: Sorting вектор строк с начальными числами
Исходная проблема заключается в следующем:
Напишите полную программу на C++, которая выводит k наиболее часто используемых слов в файле input.txt, по одному в строке в порядке убывания частоты, где k — неотрицательное целое число, считываемое из ввода. Связи разрываются произвольным образом, и если в input.txt есть только u разных слов и u ‹ k, то в выходных данных будет только u записей. Для этой задачи вы не можете использовать какой-либо класс или алгоритм STL, кроме вектора и строки. Слово — это максимальный блок непробельных символов с удаленными знаками препинания. Каждая выходная строка состоит из слова, за которым следует его частота. (входы и k-значения даны)
Благодаря тем, кто предложил использовать структуру, я получил немного более эффективное решение с меньшим количеством кода.
Однако проблема в том, что для относительно больших текстовых файлов (состоящих из >400000 слов) моя программа может работать более 5 минут и не дает никакого результата. Программа отлично работает на небольших входных файлах. Я не уверен, связано ли это с тем, что файл был слишком большим, или с самим алгоритмом связана проблема, которая вызывает переполнение/повреждение памяти.
Вот мой код программы:
struct word_freq {
int freq;
string word;
};
bool operator<(const word_freq& a, const word_freq& b) {
return a.freq < b.freq;
}
void word_frequencies(ifstream& inf, int k)
{
vector <string> input;
string w;
while (inf >> w)
{
remove_punc(w);
input.push_back(w);
}
sort(input.begin(), input.end());
// initialize frequency vector
vector <int> freq;
for (size_t i = 0; i < input.size(); ++i) freq.push_back(1);
// count actual frequencies
int count = 0;
for (size_t i = 0; i < input.size()-1; ++i)
{
if (input[i] == input[i+1])
{
++count;
} else
{
freq[i] += count;
count = 0;
}
}
// words+frequencies
vector <word_freq> wf;
for (int i = 0; i < freq.size(); ++i)
{
if (freq[i] > 1 || is_unique(input, input[i]))
{
word_freq st = {freq[i], input[i]};
wf.push_back(st);
}
}
// printing
sort(wf.begin(), wf.end());
if (wf.size() < k)
{
for (int i = wf.size()-1; i >= 0; --i)
{
cout << wf[i].word << " " << wf[i].freq << endl;
}
} else
{
for (int i = wf.size()-1; i >= wf.size()-1-k; --i)
{
cout << wf[i].word << " " << wf[i].freq << endl;
}
}
}
Если кто укажет на допущенные ошибки, буду очень признателен.
std::vector
илиstd::string
, но вы используетеstd::sort()
, что еще вы нам не говорите? - person Slava   schedule 11.05.2017remove_punc
- в вашем коде отсутствует определение этой функции. - person Snps   schedule 11.05.2017O(n³+)
). Не могу сказать, какой из них проще (вероятно, сортировать). - person Snps   schedule 11.05.2017if (count % 100 == 0)
. Таким образом, вы можете почувствовать, сколько времени это займет и кажется ли это разумным. - person Snps   schedule 11.05.2017