Поиск данных и индексация

У меня около 800 000 строк данных, хранящихся в расширенной разделяемой памяти из базы данных. Данные в форме:

Id        Color        Length          Size

1        1                 2            4
2        3                 4            5
3        2                 2            0
4        1                 2            4......and so on

Цвета могут иметь значение от 1 до 12, длину от 1 до 4 и размер от 1 до 5,
Идентификатор, длина, цвет, размер хранятся в отдельном векторе размером 800 000 в общей памяти. Итак, есть Id vector для Id, Color vector для Color и так далее.

Я хочу отфильтровать данные, прежде чем выполнять вычисления. Поэтому мне нужны данные, для которых Color равен 1, а length равен 2 и Size 4, т.е. строки 1 и 4 в приведенном выше случае. Есть ли эффективный способ фильтрации данных без использования цикла for, прохождения всех 800 000 изображений и проверки состояния?

Прямо сейчас я просто использую оператор mysql, чтобы получить идентификаторы данных, которые удовлетворяют условию.

"select Id from features_table where Color=1 and Length=2 and Size =4"

Но есть ли более быстрый способ сделать это? Или я должен придерживаться этого метода? Я ищу более быстрый метод, поэтому я не уверен, увеличит ли получение идентификаторов из базы данных время выполнения алгоритма.

Какие еще варианты я могу рассмотреть в этом случае? Я читал о хэш-таблице, B-дереве, бинарном дереве поиска, и я запутался, что подходит для этого случая. Будет ли в этом случае полезен kd-tree? Потому что многие изображения могут иметь одинаковую комбинацию цвета, длины и размера. Я не уверен, что kd-tree — это то, что нужно делать. Я читал о FLANN в opencv, используемом для kd-tree. Есть ли примеры или ресурсы, которые могут быть полезны в этом случае? Или есть какие-нибудь встроенные библиотеки с ++?

2

Решение

Похоже, вы просто делаете это один раз. Если это так, то создание любой структуры данных, содержащей все элементы, будет медленнее, чем тестирование каждого элемента. Убедитесь, что вы переходите к следующему элементу после сбоя любого из них (в C / C ++ оператор if с цветом == 1 && Длина == 2 && size == 4 автоматически оценит короткое замыкание для вас). Читайте данные в буфер, а не по одной строке или что-то еще за раз. Цикл к нулю и использование указателей, чтобы избежать неявного умножения при разрешении индексов массива. Кроме этого, никакие оптимизации не приходят на ум.

0

Другие решения

Нет более быстрого способа отфильтровать данные, кроме как просмотреть каждый элемент данных и сравнить его с фильтром, который является порядком сложности O (n). Вы должны получить доступ к каждому элементу хотя бы один раз. То же самое касается построения любой структуры данных из ваших данных, таких как дерево, хеш-таблица и т. Д. Если вы заинтересованы в фильтрации данных только один раз, просто просмотрите ее и получите отфильтрованный список. Если вам необходимо выполнить другие манипуляции с данными, вам следует подумать, какие действия вам понадобятся (вставка, удаление, сортировка и т. Д.), И выбрать наиболее эффективную структуру данных в соответствии с вашим назначением.

-1