Hasty Briefsbeta

双语

The quadratic problem nobody fixed

2 months ago
  • #algorithm
  • #regex
  • #performance
  • 正则表达式引擎在查找所有匹配时存在O(n²)复杂度问题,这是自1970年代就存在的长期难题
  • RE2、Go的regexp和Rust的regex crate等引擎承诺的线性时间匹配仅适用于单个匹配,而非全部匹配
  • 当处理类似'.*a|b'的模式和'bbbb...'这类输入时,会出现三角累加工作量,导致平方级复杂度
  • Aho-Corasick算法(1975)针对固定字符串能以线性时间解决问题,但不适用于正则表达式
  • Hyperscan/Vectorscan采用'最早匹配'语义实现线性时间,但会改变匹配结果
  • RE#引入双通道算法,在不改变语义的前提下实现线性时间全局匹配
  • RE#提供'加固'模式,即使面对对抗性输入也能保证线性时间,但会牺牲部分性能
  • 由于更高效的DFA缓存处理,RE#在处理大型字典时性能优于Aho-Corasick
  • RE#暂不支持捕获组和惰性量词,专注于POSIX语义和布尔运算
  • 名为're'的grep工具利用RE#的布尔运算符实现高级搜索功能