用于十六进制的 c/c++ 中的 Aho-Corasick 算法

Posted

技术标签:

【中文标题】用于十六进制的 c/c++ 中的 Aho-Corasick 算法【英文标题】:Aho-Corasick Algo in c/c++ for hex 【发布时间】:2015-03-23 12:28:14 【问题描述】:

我的问题 - 我正在尝试使用我在搜索网络时为 c++ 找到的 aho-corasick 算法,它目前只搜索基于字符的字符串,我希望它修改它以搜索基于十六进制的不同字符的字符串。非常感谢任何改进代码的帮助。如果我只是修改我的字符串文本,它会进入一个无限循环。

int buildMatchingMachine(const vector<string> &words, char lowestChar = 'a', char highestChar = 'z')



    memset(out, 0, sizeof out);

    memset(f, -1, sizeof f);

    memset(g, -1, sizeof g);

    int states = 1; // Initially, we just have the 0 state

    for (int i = 0; i < words.size(); ++i)

    

        const string &keyword = words[i];

        int currentState = 0;

        for (int j = 0; j < keyword.size(); ++j)

        

            int c = keyword[j] - lowestChar;

            if (g[currentState][c] == -1)

             // Allocate a new node

                g[currentState][c] = states++;

            

            currentState = g[currentState][c];

        

        out[currentState] |= (1 << i); // There's a match of keywords[i] at node currentState.

    

    // State 0 should have an outgoing edge for all characters.

    for (int c = 0; c < MAXC; ++c)

    

        if (g[0][c] == -1)

        

            g[0][c] = 0;

        

    



// Now, let's build the failure function

queue<int> q;

for (int c = 0; c <= highestChar - lowestChar; ++c)

 // Iterate over every possible input

    // All nodes s of depth 1 have f[s] = 0

    if (g[0][c] != -1 && g[0][c] != 0)

    

        f[g[0][c]] = 0;

        q.push(g[0][c]);

    



while (q.size())



    int state = q.front();

    q.pop();

    for (int c = 0; c <= highestChar - lowestChar; ++c)

    

        if (g[state][c] != -1)

        

            int failure = f[state];

            while (g[failure][c] == -1)

            

                failure = f[failure];

            

            failure = g[failure][c];

            f[g[state][c]] = failure;

            out[g[state][c]] |= out[failure]; // Merge out values

            q.push(g[state][c]);

        

    





return states;



int openFile::findNextState(int currentState, char nextInput, char lowestChar = 'a')


    int answer = currentState;

    int c = nextInput - lowestChar;

    while (g[answer][c] == -1)

        answer = f[answer];

    return g[answer][c];


【问题讨论】:

gist.github.com/andmej/1233426 你试过什么? 这不是免费的代码编写服务 @RiggsFolly:他复制了那段代码。这算不算诚实的努力? ??? (哦,因为“缺乏最低限度的理解”关闭原因!) @Jongware +1 为新的Close ReasonLacks minimal understandingStole this piece of code but I dont understand it @RiggsFolly: it used to be there ... 【参考方案1】:

我找到了一个可行的解决方案,您只需将基于十六进制的符号的最低字符和最高字符重新定义为其对应的 ascii 值而不是 int 值,还将 MAXS 和 MAXC 更改为合适的数字,现在代码适用于基于十六进制价值观。

【讨论】:

以上是关于用于十六进制的 c/c++ 中的 Aho-Corasick 算法的主要内容,如果未能解决你的问题,请参考以下文章

c/c++isdigit()函数

c/c++isdigit()函数

c/c++isdigit()函数

启动失败没有二进制文件 - gcc 与 eclipse

用于二进制分发的 clang 编译器标志(通用 CPU)

c语言 数组可以转换成字符串吗