我有一个很大的多组件密钥列表 定义了比较运算符的poi数据类型:
typedef boost::tuple<int, char, unsigned long> Key;
我想要与固定设置模式匹配的这些键, 它由相同的组件组成,但特别是 模式某些组件可以省略:
typedef boost::tuple<
boost::optional<int>
, boost::optional<char>
, boost::optional<unsigned long> > Pattern;
boost :: optional,值为unset表示 星号,“匹配一切”:
Key(1, 2, 3) match Pattern(1, 2, *)
Key(1, 2, 3) match Pattern(*, 2, 3)
我想比O(N)更快地执行比赛 N是模式的数量。
我开始使用自定义比较operator1进行模式处理 将它们存储在有序矢量中。 Operator1只是排序 其他一切后的星号。然后执行查询 与std :: lower_bound一起使用自定义比较operator2。 Operator2在比较期间省略了未设置的关键组件。 但我想我无法摆脱单一排序的矢量 因为如果第二个成分是*而我省略了它 不保证对第三个组件的“切片”进行排序 我用std :: lower_bound得到了一些有用的东西。
答案 0 :(得分:2)
按某种顺序对键进行排序。为每个组件创建一个索引,保持相同的排序顺序。
使用索引查找每个组件的下一个项目。如果指数指向同一项,则表示您匹配。如果没有选择指向最小项目的组件(按排序顺序)并跳过,直到您至少在最大项目(std :: lower_bound会这样做)。
这与交叉排序列表的算法相同。
速度取决于数据的密集程度。如果你搜索(*,*,true)和95%的数据匹配,你将是O(N)。如果数据足够稀疏,这可能非常快。