Существует матрица возможностей продукта.Он имеет тысячи строк (продуктов) и сотни функций.У него есть двоичные значения, которые показывают, есть ли у продукта эта функция или нет.Таким образом, это может быть таблица из 40 000 строк и 900 столбцов.
<strong>Product-feature matrix</strong><br/>
pr f1 f2 f3 fn ...<br/>
01 0 1 1 1<br/>
02 0 0 0 0<br/>
03 1 0 1 0<br/>
04 1 0 1 0<br/>
.....
Сначала я должен найти продукты, которые имеют заданный набор функций QEg Q = (f1 = 1, f5 = 1, f27 = 1).Проще говоря, найди синий авто, хэтчбек, 3-х дверный.
<strong>Result 1</strong><br/>
Given Q=(f1=1, f5=1, f27=1)<br/>
Relevant products: 03, 04, 08...
Во-вторых, и самое главное, я должен выяснить, сколько продуктов, которые имеют набор функций Q, также имеют функцию f_i (где i - 1..n),Другими словами, мы выбираем строки, которые удовлетворяют Q, и подсчитываем, сколько 1 в каждом столбце (производим суммирование SUM).Например, сколько синих автомобилей, хэтчбек, 3-дверный также имеет: дизельный двигатель, бензиновый двигатель, ксеноновые фары.
<strong>Result 2</strong><br/>
Given Q=(f1=1, f5=1, f27=1)<br/>
sum f2 = 943<br/>
sum f3 = 543<br/>
sum f4 = 7<br/>
sum f6 = 432<br/>
....
Конечно, это можно решить с помощью RDBMSно это не так эффективно - в общем случае это потребует полного сканирования как для поиска товаров, так и для агрегации в каждом столбце.По крайней мере, я не знаю, как построить эффективный индекс b-дерева для этой задачи.Индекс растрового изображения Oracle может помочь, но я не могу использовать Oracle.
В настоящее время мы используем MySQL для этой задачи, но она не дает хороших результатов.На самом деле мы используем целочисленное представление (мы сгруппировали объекты и храним целые числа в столбцах, а не в значениях bool), чтобы уменьшить количество столбцов.
Возможно рассматривать эту матрицу как разреженную двоичную матрицу.И это не большая проблема, чтобы сохранить его полностью в памяти.И мне интересно, можно ли применить некоторые алгоритмы для работы с разреженными матрицами, векторным пространством (SVD, умножение матрицы на вектор и так далее).Но это, вероятно, помогает в поиске продуктов, которые удовлетворяют вектору Q, а не в агрегации.Проблема заключается скорее во времени агрегации, а не в пространстве.
Вероятно, возможно сохранить матрицу в виде многосвязного списка, который поможет находить продукты и производить агрегацию для каждого столбца.
Наконец, вопрос заключается в том, как решить эту задачу.Какой алгоритм поиска наиболее эффективен для поиска продуктов с заданными функциями, а затем для подсчета продуктов с дополнительными функциями (агрегирование по каждому столбцу).