begoon's blog

By begoon, 12 years ago, In Russian

Задача:

Есть таблица некоторых критериев, которая имеет следующий вид:

A1 A2 ... A40
B1 B2 ... B40
...

Количество строк может быть около 40000.

Значение каждой ячейки -- произвольная строка (до 256 символов). Также есть специальное значение -- "*" (зведочка).

Теперь есть запрос:

Z1 Z2 ... Z40

Значения полей запроса аналогичны по структуре ячейкам таблицы, включая специальное значение.

Проверка запроса: надо найти среди строк исходной таблицы максимально совпадающую со значениями запроса. Специальное значение "*" либо в запросе, либо в таблице, означает совпадение в данной ячейке вне засимости от значения, с которым сравнивают.

Например:

XYZ GBP 123  * [все значения -- *] * 
XYZ USD 123  * [все значения -- *] * 
XYZ USD  *   * [все значения -- *] * 
*    *   *   * [все значения -- *] * 

Запрос:

XYZ USD 567 * [все значения -- *] * 

Ответом должна быть строка номер 3.

При банальном подходе можно просто заранее отсортировать строки таблицы по убыванию количества конкретных значений, и уже для каждого запроса проверять посрочно до первого удачного совпадения. Получается 40000*40 сравнений (не будем учитывать время сравнения самих ячеек).

Может тут как-то можно ускорить, используя результаты предыдущей строки? Например, обработав строку 2, мы знаем, что первые два поля уже совпадают, и может быть их можно уже не сравнивать... Можно индекс какой построить. Ограничения на память особых нет.

Можно даже сгенерить некий код-парсер, которых будет представлять логику конкретной исходной таблицы. Вот только вопрос, в чем должна быть идея этого парсера.

  • Vote: I like it
  • +16
  • Vote: I do not like it