使用多组件键进行快速部分匹配

Fast partial matching with multi-component keys

本文关键字:速部 组件      更新时间:2023-10-16

我有一个由定义了比较运算符的poi数据类型:

typedef boost::tuple<int, char, unsigned long> Key;

这些键我想与固定设置的模式相匹配,它由相同的组件组成,但特别模式某些组件可以省略:

typedef boost::tuple<
    boost::optional<int>
    , boost::optional<char>
    , boost::optional<unsigned long> > Pattern;

boost::可选,值unset表示星号,"匹配所有内容":

Key(1, 2, 3) match Pattern(1, 2, *)
Key(1, 2, 3) match Pattern(*, 2, 3)

我想比O(N)更快地进行比赛N是图案的数量。

我已经开始使用模式的自定义比较运算符1以将它们存储在排序向量中。Operator1只是排序星号在其他事物之后。然后执行查询带有std::lower_bound和自定义比较运算符2。Operator2在比较过程中省略了未设置的关键组件。但我想我不能逃脱单一排序向量的惩罚因为如果第二个分量是*,而我省略了它不能保证对第三个组件的"切片"进行排序我用std::lower_bound得到了一些有用的东西。

按某种顺序对键进行排序。为每个组件建立索引,保持相同的排序顺序。

使用索引查找每个组件的下一项。如果索引指向同一项,则匹配。如果没有,请选择指向最小项的组件(按排序顺序),然后跳过,直到您至少到达最大项为止(std::lower_bound会这样做)。

这与用于交叉排序列表的算法相同。

速度取决于你的数据密度。如果你搜索(*,*,true),并且95%的数据匹配,你就会是O(N)。如果数据足够稀疏,这可能非常快。