11 2013 档案

有多个初始状态的 DFA
摘要:最近做了一项工作:允许一个 DFA 有多个起始状态(可以称作根: root)。引入这个概念有很多好处,主要体现在 DFA Union 中,这个操作通过 NFA 到 DFA 的转化来完成,算法思想很简单:创建一个 NFA,该 NFA 只有初始状态是非确定 (non-DFA) 状态:初始状态只有 ε 转移,这些 ε 转移指向所有要被 Union 的 DFA 的初始状态,然后将该 NFA 转化为 DFA。因为 NFA 转化 DFA 是 NSpace 的,虽然很多数情况下只有线性复杂度,我们仍然希望尽可能减小这个复杂度。对于多正则表达式匹配(Multiple Regular Expression Ma 阅读全文

posted @ 2013-11-28 22:17 能发波 阅读(868) 评论(0) 推荐(0)

gcc 4.7.3 的一个 c++11 bug
摘要:昨天一个朋友 checkout 了我的 febird 代码,编译时出现了一个诡异的错误。经过仔细勘察,他的 g++ 版本是 4.7.3,而我测试过的 g++4.7.2,g++4.8.2均无问题。后来修改代码,解决了那个问题,但要还原那个bug时,很费了一番力气。以下是还原的那个 bug 的一段简单代码,不过可能不是最简单的。#include struct A { int x = 10;};templatestruct B : A { static void foo(A* a) { // auto b = static_cast(a); // g++ 4.7.3 compi... 阅读全文

posted @ 2013-11-13 10:30 能发波 阅读(335) 评论(0) 推荐(0)

多正则表达式匹配(Multiple Regular Expression Matching)
摘要:目前 febird 中的自动机库已支持正则表达式,并且,支持的是多正则表达式匹配:给定 M 个正则表达式,每个正则表达式有一个 [0, M) 的唯一 ID,该算法为这些正则表达式生成一个 DFA。再给定一个输入文本 Text,长度为 T,假定只计最长匹配,该 Text 可以匹配 M 个正则表达式中的的 K 个。在该DFA上运行我的匹配算法,可以在 O(T + K) 的时间复杂度内找到那 K 个正则表达式,这个时间复杂度与 M 完全没有关系!从信息论的角度讲,该算法是最优的。如果要获得在 Text 中的所有 N 个匹配点(N on_match);delim 一般是 \t ,创建用于该接口的 DF 阅读全文

posted @ 2013-11-03 22:22 能发波 阅读(805) 评论(0) 推荐(0)

导航