【发布时间】:2017-10-10 21:52:25
【问题描述】:
我仍在努力解决这篇文章中提到的问题: Sorting vector of strings with leading numbers
原来的问题如下:
编写一个完整的 C++ 程序,输出文件 input.txt 中最常用的 k 个单词,按频率降序排列每行一个,其中 k 是从输入读取的非负整数。关系是任意打断的,如果 input.txt 中只有 u 个不同的词且 u
感谢那些建议使用结构的人,我最终得到了一个更高效、代码更少的解决方案。
然而,问题是,对于比较大的文本文件(超过 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()还有什么你没有告诉我们的? -
valgrind 如果卡住了也很有用
-
如果您希望人们帮助您,请先更好地帮助人们。您的代码难以阅读。
标签: c++ file-io text-files fstream word-frequency