C ++搜索索引

时间:2016-03-24 21:06:20

标签: python c++ arrays string

#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博士对模式的解释:我已经设法将文本文件链接起来,但我不确定下一步是创建代码来搜索文件,对于某些单词。任何帮助都会很棒。

我想过可能会创建一个数组,然后让它遍历每个元素但不确定。任何帮助都会非常有帮助。 在阵列中的位置。

谢谢

2 个答案:

答案 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