使用多组件键进行快速部分匹配
Fast partial matching with multi-component keys
我有一个由定义了比较运算符的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)。如果数据足够稀疏,这可能非常快。
相关文章:
- 如何将 txt 文件中的行分隔为组件C++
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 到连接组件算法的问题(递归)
- 如何将部分流作为参数传递
- 两个 COM 组件中 ENUM 的重复条目
- 为什么 gcc 会产生这种奇怪的组件与叮当声?
- 使用 bfs 解决连接组件问题时得到错误的答案
- 如何在ECS框架中更新组件数据和通知系统
- 如何从ECS中的模板方法获取组件?
- 使用蓝牙组件将数据从Android手机传输到串行设备时出现问题
- 组件上的虚幻引擎可蓝图UFUNCTION会导致构建错误
- 有没有办法修改'operator->',以便'z->im'返回复数的虚部
- 在C++中访问蓝图类组件的正确方法是什么?
- 有关纯 ECS(实体组件系统)和更新系统的问题
- 提高基于组件的游戏引擎的效率
- 从组件的 std::type_index 获取派生最多的类型
- 在线程函数中处理数据向量时进行线程竞速
- 我们可以将阈值应用于色彩空间模型的单个组件(如 RGB 和 LAB)吗?
- 如何通过 UActor组件获取演员列表?
- 在Visual Studio 2017中使用c ++组件构建python解决方案时出现问题