Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 优化.txt文件中的字符串搜索_C++_Sorting_Search_Optimization_Text - Fatal编程技术网

C++ 优化.txt文件中的字符串搜索

C++ 优化.txt文件中的字符串搜索,c++,sorting,search,optimization,text,C++,Sorting,Search,Optimization,Text,这可能是一个非常愚蠢的问题,但我如何优化此代码以使其更高效(更快、更少的内存消耗)?我编写这段代码是为了帮助我对一些文本文件进行排序。它从第一个文件中读取每个字符串,然后搜索第二个文件,直到找到所有相关字符串,然后在第三个文件中写入一些匹配的字符串。代码如下: ifstream h("SecondFile.txt"); ifstream h2("FirstFile.txt"); ifstream uh("MatchedStrings.txt"); ofstream g("sorted.txt")

这可能是一个非常愚蠢的问题,但我如何优化此代码以使其更高效(更快、更少的内存消耗)?我编写这段代码是为了帮助我对一些文本文件进行排序。它从第一个文件中读取每个字符串,然后搜索第二个文件,直到找到所有相关字符串,然后在第三个文件中写入一些匹配的字符串。代码如下:

ifstream h("SecondFile.txt");
ifstream h2("FirstFile.txt");
ifstream uh("MatchedStrings.txt");
ofstream g("sorted.txt");    
int main()
    {
        string x, y, z;
        cout << "Sorting..." << endl;;
        while (!h.eof()){
            h >> x;
            while (!h2.eof() || (y == x)){
                h2 >> y;
                uh >> z;
                if (y == x){
                    g << z << endl;
                    break;
                    h2.clear();
                    h2.seekg(0);
                    uh.clear();
                    uh.seekg(0);
                }
            }
            if (h2.eof() && (y != x)){
                g << "none" << endl;
                h2.clear();
                h2.seekg(0);
                uh.clear();
                uh.seekg(0);
            }
        }
        cout << "Finished!";
    }

在字符串向量中加载
h
,通过将每个字符串与向量的内容进行比较,循环一次
h2


由于测试是对称的,因此可以选择
h
作为两个文件中最小的文件。这样,您将节省内存和时间,尤其是当其中一个文件比另一个文件大得多时。如果比较花费大量时间,使用集合(
std::set
)而不是向量也会有所帮助。

假设文件中的字符串数分别为n和m

你现在这样做,复杂性是μ(nm)。此外,复杂度常数是那些文件操作的常数,它们的速度非常慢

相反,您应该将其中一个文件读入容器,然后比较容器之间的键。这将使运行时间减少到预期的Θ(n+m)



作为补充说明,您可能需要查看(使用,例如。)。

从内存中的第一个文件收集所有搜索字符串,并在外部循环中使用这些字符串搜索第二个文件可能会更快。我会尝试一下,然后返回结果。@πάνταῥεῖ 我无法让它工作:/I我尝试将其读入内存,但得到一个未处理的异常0xCCCDO,正如@Ilya所说,使用
std::vector
。为什么所有流都是全局的?无论如何,您只有一个函数!而且,如果没有这些文件,就不可能重现这个问题。此外,是否需要从文件中输入信息来重现问题?首先尝试提取一个最小但完整的示例!问题中还有一个“消耗内存”的部分。如果其中一个文件很大,您可能不想将其加载到内存容器中。@Ilya谢谢,更正了。我现在也看到你在你的回答(+1)中提到了这一点。不过,我建议在这里使用
unordered.*
容器。啊,我不知道
std::unordered.\u集
,学到了一些东西,谢谢。感谢您的支持。我使用了您给我的示例。
#include <iostream>
#include <fstream>
#include <string>

using namespace std;
ifstream h("SecondFile.txt");
ifstream h2("FirstFile.txt");
ifstream uh("MatchedStrings.txt");
ofstream g("sorted.txt");

int main()
{
    string x;
    bool write_none = true;
    int i = 0,l=0;
    string check[] = {""};
    string unhashed_checked[] = { "" };
    string sorted_array[] = { "" };
    cout << "Sorting..." << endl;
    //Get to memory
    while (!h2.eof())
    {
        h2 >> check[i];
        uh >> unhashed_checked[i];
        i++;
    }

    while (!h.eof()){
        h >> x;
        write_none = true;
        for (int t = 0; t <= i;t++)
        {
            if (x == check[t])
            {
                break;
                write_none = false;
                sorted_array[l] = unhashed_checked[i];
                l++;
            }
        }
        if (write_none)
        {
            sorted_array[l] = "none";
            l++;
        }
    }
    for (int k = 0; k <= l; k++)
    {
        g << sorted_array[k]<<endl;
    }
    cout << "Finished!";
}
Unhandled exception at 0x01068FF6 in ConsoleApplication1.exe: 0xC0000005: Access violation writing location 0xCCCCCCCC