C++ 实现容器时,写 iterator 很烦

阅读更多关于《C++ 实现容器时,写 iterator 很烦》

实现一个 C++ 容器时,都要提供 iterator, const_iterator, 一般情况下 iterator 和 const_iterator 几乎完全一样,不一样的地方仅在于: 继续阅读

用自动机表达嵌套的数据

阅读更多关于《用自动机表达嵌套的数据》

嵌套数据的典型就是文件系统的目录层次,XML,JSON 等,它们都有专门的存储方式。不过,如果用自动机来存储,更是恰到好处,在这种应用场景中,使用 这篇文章 中提到的 map2:将路径的每层目录用分隔符隔开,比如/ 分隔继续阅读

一个模式识别问题

阅读更多关于《一个模式识别问题》

任意两个字符串 s, t,如果能找到一种替换方式,对 t 中的每个字符 a ,用 s 中的一个字符 b 替换,最后得到一个字符串 t’,如果 t’ 与 s 相同,用符号计作 s->t;如果 s->tt->s,我们称 s 与 t 等价。

例如,下面 4 个字符串就是(互相)等价的: 继续阅读

使用 MapReduce 创建超大巨型自动机

阅读更多关于《使用 MapReduce 创建超大巨型自动机》

一直以来,自动机的创建程序(adfa_build/dawg_build/kvbin_build 等)性能虽然尚可,以最常用的 adfa_build 来说,根据不同的输入文本,平均吞度量能达到每秒钟 5~20M 。这个速度看上去还不错,至少比竞品要快了许多,但是,如果有非常大的数据 继续阅读

binary tree walk

阅读更多关于《binary tree walk》

简单,优美,的代码,你能看出来哪些是二叉树的后序、前序、中序遍历吗?你还知道二叉树有什么遍历方法? 继续阅读

sse4.2 的字符串操作指令

阅读更多关于《sse4.2 的字符串操作指令》

前段时间实现了基于 Succinct Data Structure 的自动机,这种自动机(内存)存储方式将状态转移的 label 单独存储起来,从而,查找 label 就是一个在 byte 数组中查找 byte 的操作,并且,绝大多数情况下,需要查找的这个 byte 数组都非常短(状态的平均转移(label)数一般情况下大约是 2 )。 继续阅读