在c ++中将行匹配到规则

时间:2012-01-24 13:42:32

标签: string algorithm line matching

我有一条线和一套规则(其他线)。匹配的行(line = rule)可能很长;规则集可能很大,每个规则可能很长。较短的规则可能是较长的一部分(需要选择更长的时间) 目前,我有大约70条规则,长度<30个字符,组织在一个长if-else-if链中 有没有办法预测性能会有什么降低?
是否有更快的方法将比较线与每个规则进行匹配?

编辑:没有文字文件。我有一个编码的字符序列,我通过if-elses比较“规则”,然后采取相应的行动。

1 个答案:

答案 0 :(得分:1)

如果您只想检查输入行是否等于任何行规则,那么使用std::set(或std::map,如果您希望每个规则有不同的行为)来存储它们。这将匹配复杂度降低到O(lg N ),其中 N 是规则数。

更好的是,使用unordered_set(C ++ 11)来表现O(1)。

如果行为不依赖于匹配的规则,那么您也可以使用RE2之类的工具从规则(例如(niVVVd__xniVVd__)|(niVVVdxniVVd))编译正则表达式,以获得最坏情况的O(< em> n )行为,其中 n 是输入字符串的长度。

由于您正在比较相等性,因此您无需先匹配最长的规则。