#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
using namespace std;
infile.get(array[position]);
position++;
}
array[position - 1] = '\0';
for (int i = 0; array[i] != '\0'; i++)
{
cout << array[i];
}
}
}
cout << "Displaying Array..." << array << endl;
//stringstream buffer;
//buffer << in.rdbuf();
//std::string test = buffer.str();
//std::cout << test << std::endl << std::endl;
//
system("pause");
}
我正在尝试创建一个程序,它将搜索文本文件,因为我在20世纪80年代曾在曼彻斯特大学攻读过本科学位。在我的“并行计算”课程中,我们有一个关于曼彻斯特数据流机器的讲座 - 一个将要接管世界的并行计算架构。
我在2000年代在华盛顿大学攻读硕士学位。在我的“并行计算”课程中,我们有一个关于曼彻斯特数据流机器的讲座,以及为什么它没有接管世界。*
20年来,似乎我们想出了很多关于并行计算的想法,而没有达到将所有内容联系在一起的单一想法。对于串行计算,我们有Von Neumann架构,即使我们现在有缓存和分支预测和流水线等,我们仍然可以将基本机器视为Von Neumann机器。
我见过的最实用的方法是使用并行编程模式。根据您与谁交谈,以及他们如何对模式进行分组,这些模式中有13到20个。我偏爱Michael McCool博士对模式的解释:我已经设法将文本文件链接起来,但我不确定下一步是创建代码来搜索文件,对于某些单词。任何帮助都会很棒。
我想过可能会创建一个数组,然后让它遍历每个元素但不确定。任何帮助都会非常有帮助。 在阵列中的位置。
谢谢
答案 0 :(得分:1)
有很多算法,例如Knuth Morris Pratt或Rabin-Karp。我认为维基百科完美地描述了它们。但他们通常对1弦很好。对于多个字符串,最好的算法是从文本构建后缀树并搜索树。
答案 1 :(得分:0)
最简单的方法是使用标准库。目前搜索是线性的,但是从c ++ 17开始,如果性能很关键,那么库将允许轻松并行化。
这是一个仅使用标准库的解决方案(需要c ++ 11)。
请注意从流中读取字符串的正确方法。
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <sstream>
#include <algorithm>
#include <iomanip>
using search_term_vector = std::vector<std::string>;
using search_results = std::map<std::string, std::vector<std::size_t>>;
std::vector<std::string> load_search_terms()
{
constexpr char search_term_file[] = "pig dog cat garbage";
std::istringstream is(search_term_file);
std::vector<std::string> search_terms;
std::string term_buffer;
while (is >> term_buffer) {
search_terms.push_back(std::move(term_buffer));
}
return search_terms;
}
search_results search_space_for_terms(const std::string& search_space, const search_term_vector& terms)
{
search_results results;
for (auto const& term : terms)
{
auto& result = results[term];
auto icurrent = std::begin(search_space);
while (icurrent != std::end(search_space))
{
auto ipos = std::search(icurrent, std::end(search_space),
std::begin(term), std::end(term));
if (ipos != std::end(search_space))
{
result.push_back(std::distance(std::begin(search_space), ipos));
std::advance(ipos, term.length());
}
icurrent = ipos;
}
}
return results;
}
int main()
{
using namespace std::string_literals;
auto search_space = "tdogicatzhpigu"s;
auto search_terms = load_search_terms();
auto results = search_space_for_terms(search_space, search_terms);
for (auto const& result_pair : results)
{
std::cout << std::quoted(result_pair.first) << " was found ";
auto const& locations = result_pair.second;
if (locations.empty())
{
std::cout << "nowhere" << std::endl;
}
else
{
auto sep = (locations.size() > 1) ? "at positions " : "at position ";
for (auto pos : locations)
{
std::cout << sep << pos;
sep = ", ";
}
std::cout << std::endl;
}
}
return 0;
}
预期结果:
"cat" was found at position 5
"dog" was found at position 1
"garbage" was found nowhere
"pig" was found at position 10