【问题标题】:trie reg exp parse step over char and continuetrie reg exp parse 跳过 char 并继续
【发布时间】:2023-10-06 02:16:01
【问题描述】:

设置:1) 由链接节点和向量数组组成的字符串 trie 数据库,该向量数组链接到在叶子中终止的下一个节点,2) 递归正则表达式函数,如果 A) char '*' 在所有路径中继续下去,直到字符串达到长度限制,然后继续沿剩余的字符串路径(如果有效)和 B) char '?'继续向下所有路径 1 个字符,然后继续向下剩余的字符串路径(如果有效)。 3) 在 reg 表达式之后,测量候选字符串与 'try' 字符串的编辑距离。

问题:reg 表达式可以很好地添加字符或交换吗?对于 char 但如果剩余的字符串有错误,则没有有效路径到终止叶;使匹配函数变得多余。我尝试添加“跨步”? char 如果到达节点向量的末尾,然后跟随该节点的每条路径 - 只允许此跨步一次;导致内存异常;我无法从逻辑上找到它访问超出范围的向量的原因 - bactracking?

问题:1)正则表达式如何跳过无效字符并继续路径? 2) 为什么将 'sticking' 字符换成 '?'导致溢出?

功能:

void Ontology::matchRegExpHelper(nodeT *w, string inWild, Set<string> &matchSet, string out, int level, int pos, int stepover)
{   
    if (inWild=="") {
        matchSet.add(out);
    } else {
        if (w->alpha.size() == pos) {
            int testLength = out.length() + inWild.length(); 
            if (stepover == 0 && matchSet.size() == 0 && out.length() > 8 && testLength == tokenLength) {//candidate generator
                inWild[0] = '?';
                matchRegExpHelper(w, inWild,  matchSet, out, level, 0, stepover+1);
            } else 
                return; //giveup on this path
        }
        if (inWild[0] == '?' || (inWild[0] == '*' && (out.length() + inWild.length() ) == level ) ) { //wild
            matchRegExpHelper(w->alpha[pos].next, inWild.substr(1), matchSet, out+w->alpha[pos].letter, level, 0, stepover);//follow path -> if ontology is full, treat '*' like a '?'
        } else if (inWild[0] == '*')
            matchRegExpHelper(w->alpha[pos].next, '*'+inWild.substr(1), matchSet, out+w->alpha[pos].letter, level, 0, stepover); //keep adding chars
        if (inWild[0] == w->alpha[pos].letter) //follow self
            matchRegExpHelper(w->alpha[pos].next, inWild.substr(1), matchSet, out+w->alpha[pos].letter, level, 0, stepover); //follow char 
        matchRegExpHelper(w, inWild, matchSet, out, level, pos+1, stepover);//check next path
    }
}

错误信息:

+str    "Attempt to access index 1 in a vector of size 1." std::basic_string<char,std::char_traits<char>,std::allocator<char> >
+err    {msg="Attempt to access index 1 in a vector of size 1." } ErrorException

注意:如果不使用额外的跨步门,此功能适用于数百个带有“*”通配符的测试字符串

半已解决:我在每个调用 w-&gt;alpha[pos]... 的路径上放置了一个 pos &lt; w-&gt;alpha.size() 条件 - 这可以防止回溯调用尝试访问具有越界索引值的向量。还有其他问题需要解决 - 它无限循环添加 ?并回溯以将其删除,然后重复。但是,现在继续前进。

修改后的问题:为什么在回溯过程中位置索引会累积和/或不递减 - 所以在某些时候它会调用 w-&gt;alpha[pos]... 无效位置,该位置要么从下一个节点保留,要么在向上传递时以某种方式递增 pos+1

【问题讨论】:

  • 在跟踪步骤轨迹一小时后,看起来路径终止并且递归回溯三个节点到“?”并递增到节点处的向量中的下一个字符。在某些时候,位置为 1,向量的大小为 1,因此引用了超出范围的向量单元。帮助。
  • 发现了一个问题,对于测试用例,在 stepover 处只有一个链接节点。因此,当那条路径不起作用时,它会回溯到 stepover 并尝试下一条路径——那是不存在的。但是,为什么它要尝试另一条路径,因为所有路径都已尝试过 (w->alpha.size() == pos)` 应该已经终止了函数。回溯在达到条件测试之前做了一些事情。
  • 我认为将 reg exp 函数组合到距离匹配函数中并在那里处理无效路径是有意义的。如果我只希望 reg exp 用于有效路径,那么我使用 reg exp 函数,或者如果考虑无效路径,那么我使用 match 函数。关于为什么回溯导致尝试访问无效向量单元的问题仍然存在。

标签: recursion string-matching trie


【解决方案1】:

已解决:将正则表达式 wilds 函数组合为匹配函数中的循环

【讨论】: