运行蛮力算法出错?

Posted

技术标签:

【中文标题】运行蛮力算法出错?【英文标题】:Error with running BruteForce algorithmn? 【发布时间】:2013-09-08 18:30:29 【问题描述】:

我正在接受这样的用户输入:

algo_type "pattern" filename 

例如。

bf "inging" input_file.txt

到目前为止,我将用户输入分成三个不同的变量,一个用于 algo_type,一个用于我正在寻找的模式,一个用于文件名。一旦我得到模式和文件名,我就会尝试将模式带入 Bruteforce 算法并搜索每一行并打印该模式在 .txt 文件的行中出现的位置。现在,虽然每次我将输入输入到算法中,它都会返回 -1 表示 BruteForce 没有运行?我在这里到底做错了什么?

int BruteForce(const string& line, const string& pattern)
    int n , m;
    n = line.length();
    m = pattern.length();

    for(int  i = 0 ; i < n - m ; i++)

            int j = 0;

            while( j < m  && line[i + j] == pattern[j])
            j = j+1;

            if( j == m)
                    return i;

                    
                    
    
    return -1; 
 

  int main()

    string text, algo_type , pattern , fname, line;
    getline(cin ,text);
    istringstream  iss(text);

    if(iss >>  algo_type  >>  pattern  >> fname)
            cout <<  algo_type  <<  pattern << fname << "'\n'";
    

    int i = 0;
    ifstream ifs;
    ifs.open(fname.c_str());
    while(getline(ifs, line) && fname != "")
            if( algo_type == "bf")
                    cout << "Line " << i++ << ":" << BruteForce(line,pattern) << endl;

            
    
    return 0;
   

【问题讨论】:

你为什么用我回答中的修复来编辑你的问题?你是说问题仍然存在,即使有编辑?现在还不清楚 我把 return -1;在适当的位置。尽管我的蛮力算法不起作用。我在想我读取 .txt 文件的方式有问题? 您不使用std::string::findstd::find 是否有原因? 我添加了 using namespace std;抱歉没有说清楚。 @sehe - 这就是我想问的。 【参考方案1】:

我想您希望 return -1 在 BruteForce 结束时,而不是在第一次迭代结束时。

另外,第一个循环条件需要有&lt;= 而不是&lt;,否则将找不到以该位置结尾的匹配项。

这是一个完整的固定版本:EDIT 根据编辑,在行内列出多个匹配项:

#include <string>

using namespace std;

int BruteForce(const string& line, size_t start, const string& pattern) 
    const size_t n = line.length();
    const size_t m = pattern.length();

    if (n<m) return -1;

    for(size_t i = start; i <= (n - m); i++) 
        for(size_t j=0; j < m  && (line[i + j] == pattern[j]); ++j) 
            if(j == m-1) 
                return i;
            
        
    
    return -1;


#include <iostream>
#include <fstream>
#include <sstream>

int main() 
    string text, algo_type, pattern, fname, line;
    getline(cin ,text);
    istringstream iss(text);
    if(iss >>  algo_type  >>  pattern  >> fname) 
        cout << " " << algo_type  << " " << pattern <<  " " <<fname << "\n";
    

    int i = 1;
    ifstream ifs;
    ifs.open(fname.c_str());
    while(getline(ifs, line) && fname != "") 
        if(algo_type == "bf") 
            int pos = -1;

            while (-1 != (pos = BruteForce(line, pos+1, pattern)))
                cout << "Line " << i << ":" << pos << " " << line << endl;
        
        i++;
    
    return 0;

在 Coliru 上观看直播:http://coliru.stacked-crooked.com/a/f1a7693d7d3bd7c5

我已经用

测试过了
./test <<< "bf iss /etc/dictionaries-common/words" | grep Miss

打印出来的

Line 10241:1 Miss
Line 10242:1 Mississauga
Line 10242:4 Mississauga
Line 10243:1 Mississippi
Line 10243:4 Mississippi
Line 10244:1 Mississippi's
Line 10244:4 Mississippi's
Line 10245:1 Mississippian
Line 10245:4 Mississippian
Line 10246:1 Mississippian's
Line 10246:4 Mississippian's
Line 10247:1 Mississippians
Line 10247:4 Mississippians
Line 10248:1 Missouri
Line 10249:1 Missouri's
Line 10250:1 Missourian
Line 10251:1 Missourian's
Line 10252:1 Missourians
Line 10253:1 Missy
Line 10254:1 Missy's

【讨论】:

谢谢,我一定会添加该功能。 @user2757849 我想我找到了罪魁祸首。您需要注意您的 constssigned/unsigned 比较:/ 好吧,所以你的算法和我的算法在查找模式的第一次出现方面具有相同的确切输出,现在的问题是其他事件发生在同一行中。因此,算法找到第一个匹配项,然后移动到下一行,而不会在该行中找到该模式的其他匹配项。 @user2757849 就我而言,这很好。此外,您最初编写的算法没有找到相同的解决方案(因为这就是我修复第一个循环的条件的原因)。 您说得对,我对 C++ 完全陌生,可以进行一些研究。我感谢您的帮助,尽管它对让我理解和调试我的代码非常有帮助,非常感谢,对任何挫折感到抱歉。

以上是关于运行蛮力算法出错?的主要内容,如果未能解决你的问题,请参考以下文章

Java问题中的蛮力数独求解器算法

如何从蛮力算法转向智能算法? [关闭]

在 C++ 中创建蛮力算法 [关闭]

字符串字符串查找 ( 蛮力算法 )

算法——蛮力法之顺序查找和蛮力字符串匹配

BF算法(蛮力匹配算法)