2014年1月9日

rdtsc 备忘

摘要: from:http://stackoverflow.com/questions/6814792/why-is-clock-gettime-so-erraticstatic uint64_t rdtsc() {#if defined(__GNUC__)# if defined(__i386__) uint64_t x; __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x)); return x;# elif defined(__x86_64__) uint32_t hi, lo; __asm__ __volatil 阅读全文

posted @ 2014-01-09 17:12 能发波 阅读(147) 评论(0) 推荐(0) 编辑

2014年1月5日

多正则表达式匹配 (Multiple Regular Expression Matching) 中的动态 DFA 算法

摘要: 前一段时间,在将多正则表达式匹配工具用于数十万任意的正则表达式时,以前一直担心的问题终于出现了:NFA 转化 DFA 时的指数爆炸,那样的 DFA 根本创建不出来,因为那些正则表达式之间有不可预料的各种交集!这个问题对我打击很大,我甚至顿时觉得多正则表达式匹配工具完全是个废柴,最多,是个玩具!但是,只有挑战,才能激励人的斗志,挖掘人的潜能。我想起了曾经对之不屑一顾的动态 DFA 匹配算法,之前我在研究 RE2 时知道,RE2 在动态 DFA 的内存用量达到限定时,会抛弃已经创建整个动态 DFA,因为 DFA 的状态图比较复杂,节点之间互相引用,无法象普通的 Cache 一样部分的进行 Swap 阅读全文

posted @ 2014-01-05 21:43 能发波 阅读(281) 评论(0) 推荐(0) 编辑

2013年12月17日

多正则表达式匹配工具 的用法

摘要: 2014年3月25日22:55从http://code.google.com/p/febird/wiki/MultiRegexMatch更新至最新版Introduction介绍Compileregex_builder 使用方法命令行选项与参数关于 -d 选项输入文件Regex.txt 的格式一个示例的Regex.txt非常重要!注意事项!匹配接口: 二进制模式MultiRegexFullMatchMultiRegexSubMatch匹配接口: 文本模式IntroductionThis Multiple Regex Matching solution includes two parts:An 阅读全文

posted @ 2013-12-17 17:34 能发波 阅读(1020) 评论(0) 推荐(0) 编辑

2013年11月28日

有多个初始状态的 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 能发波 阅读(764) 评论(0) 推荐(0) 编辑

2013年11月13日

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 能发波 阅读(316) 评论(0) 推荐(0) 编辑

2013年11月3日

多正则表达式匹配(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 能发波 阅读(765) 评论(0) 推荐(0) 编辑

2013年9月24日

boost 这帮人也超级不靠谱

摘要: 刚才开始用 boost::range,就查看了了一下 boost 源码,发现 boost-1.50 一个 bug,觉得应该在新版中已经修改了,下载了最新的 1.54 版,进去一看,bug 仍然在!接着,到 boost bug 追踪系统,准备提交这个 bug ,搜了一下,很快发现,这个bug 在 17 个月前,boost-1.49 就报告出来了:range::unique does not forward predicate,一年半之间,作者竟然对此 bug 充耳不闻!或许是提 bug 的哥们太屌丝了,这个作者直到 8 天前才修改了该 bug , bug 提交者竟然感激地痛哭流涕! 阅读全文

posted @ 2013-09-24 10:58 能发波 阅读(205) 评论(0) 推荐(0) 编辑

2013年8月15日

把自动机用作 Key-Value 存储

摘要: 以前只有代码,最近简单写了一点文档: google code 上的链接(总是最新)本文只关系到有穷状态自动机,本文也不讲具体的算法,只讲一些基本概念,以及用本软件的自动机能做什么,怎么用也有其他一些开源软件实现了本软件的部分功能,但总体上,不论是从功能还是性能(运行速度,内存用量)上考虑,到目前为止,我能找到的其它所有同类开源软件都完全无法与本软件竞争!欢迎大家一起交流!自动机是什么关于自动机的形式化定义,可以参考 wikipedia:自动机有穷状态自动机 (FSA)确定性的有穷自动机 (DFA)这是本文的重点非确定性的有穷自动机 (NFA)很多 DFA 的构造需要 NFA 作为媒介DFA 的 阅读全文

posted @ 2013-08-15 11:51 能发波 阅读(297) 评论(0) 推荐(0) 编辑

2013年3月24日

原地排序-更简洁的算法

摘要: 在我以前的这篇文章中:原地排序与链表翻转解决这个问题是先把链表翻转,然后再循环左移,原理是清楚了,可是稍显繁琐。这里有更简单的解法:void rearrange(KeyVal* a, int n) { for (int i = 0; i next = p->next->next,这是一个删除链表结点的操作!swap(a[i], a[j]) 实际上是将 a[j] 从 j 所属的那个大环状链表中删除!该算法的本质是:每次碰到一个结点,就将该结点的后继结点从循环链表中删除,删除的同时,被删除的那个结点就归位了。 阅读全文

posted @ 2013-03-24 19:24 能发波 阅读(272) 评论(0) 推荐(0) 编辑

字符串匹配中的图论

摘要: 问题有一个字符串由多个变量拼接而成: "$x1$x2$x3$x4$x5$x6..." ,这个列表可以一直延伸到 $x10000,而每个变量都至少有一种可能的取值,为了简化问题,每个变量不会再引用别的变量。现在,给定一个字符串T,判断这个字符串是否能由上面这个"$x1$x2$x3$x4$x5$x6..." 生成。分析我们可以算出,总的可能性(最多)是 n1*n2*n3*n4*n5*n6...。最笨的办法因为现实中不会有太极端的情况,我们可以将这些字符串全部扩展出来,放入一个hash table。但是,如何得到这些扩展结果呢?这是一个笛卡尔积的问题,可以用最 阅读全文

posted @ 2013-03-24 10:51 能发波 阅读(198) 评论(0) 推荐(0) 编辑

导航