【发布时间】: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->alpha[pos]... 的路径上放置了一个 pos < w->alpha.size() 条件 - 这可以防止回溯调用尝试访问具有越界索引值的向量。还有其他问题需要解决 - 它无限循环添加 ?并回溯以将其删除,然后重复。但是,现在继续前进。
修改后的问题:为什么在回溯过程中位置索引会累积和/或不递减 - 所以在某些时候它会调用 w->alpha[pos]... 无效位置,该位置要么从下一个节点保留,要么在向上传递时以某种方式递增 pos+1?
【问题讨论】:
-
在跟踪步骤轨迹一小时后,看起来路径终止并且递归回溯三个节点到“?”并递增到节点处的向量中的下一个字符。在某些时候,位置为 1,向量的大小为 1,因此引用了超出范围的向量单元。帮助。
-
发现了一个问题,对于测试用例,在 stepover 处只有一个链接节点。因此,当那条路径不起作用时,它会回溯到 stepover 并尝试下一条路径——那是不存在的。但是,为什么它要尝试另一条路径,因为所有路径都已尝试过 (w->alpha.size() == pos)` 应该已经终止了函数。回溯在达到条件测试之前做了一些事情。
-
我认为将 reg exp 函数组合到距离匹配函数中并在那里处理无效路径是有意义的。如果我只希望 reg exp 用于有效路径,那么我使用 reg exp 函数,或者如果考虑无效路径,那么我使用 match 函数。关于为什么回溯导致尝试访问无效向量单元的问题仍然存在。
标签: recursion string-matching trie