У меня есть большой список ключей многокомпонентных построен из типов поите данные с операторами сравнения определенно:Быстрого частичное соответствие с ключами многокомпонентными
typedef boost::tuple<int, char, unsigned long> Key;
Этих ключами я хочу, чтобы соответствовать против фиксированных шаблонов набора, который состоит из тех же компонентов, но, в частности рисунка некоторые компоненты могут быть опущены:
typedef boost::tuple<
boost::optional<int>
, boost::optional<char>
, boost::optional<unsigned long> > Pattern;
подталкивание :: опционально со значением отключенном представляет звездочку, «Соответствуют всем»:
Key(1, 2, 3) match Pattern(1, 2, *)
Key(1, 2, 3) match Pattern(*, 2, 3)
И я хочу, чтобы выполнить матчи быстрее, чем O (N), где N является количество моделей.
Я начал с пользовательского оператора сравнения1 для узоров , чтобы сохранить их в отсортированном виде. Оператор1 просто сортирует звездочки после всего остального. Затем выполните запросы с помощью std :: lower_bound с пользовательским оператором сравнения2. Оператор2 отключает блокировку ключевых компонентов во время сравнения. Но я не могу уйти с разовым сортированным вектором , потому что если второй компонент - это *, и я его пропустил , то нет гарантии, что «срез» третьих компонентов отсортирован , и я получаю что-то полезное с помощью std :: lower_bound.
вам понадобится один указатель на «форму» поиска. построение индексов дорого, но вы можете использовать unordered_map, чтобы получить среднее постоянное время поиска. –