Скажем, у меня есть большой массив из 32-битных 32-бит, в которых каждое значение имеет не более N бит. Теперь я хочу вернуть подмножество, которое соответствует запросу Target AND Value == Target, то есть значения, в которых биты целей отображаются в значениях массива.
Грубая сила проста, просто итератор массива и извлечения, где target & value == target. Это становится слишком медленным, если M становится очень большим. Кто-нибудь имеет представление о том, как преобразовать массив в структуру данных, которая более оптимальна для поиска?
Один из способов - хранить массивы или значение для каждого бита (для 32-битного массива вам нужно 32 из них), а затем искать только значения, соответствующие каждому биту в целевом значении. Это немного помогает, если N не приближается к 32, или цель близка к N бит. Поскольку то, что я ищу, по сути, является частичным совпадением, хеширование или сортировка, похоже, не помогают.
Требуются точные правильные результаты. Это должно работать без доступа к параллельному оборудованию (например, к графическому процессору или SIMD).
Я буду использовать С++, но только некоторые указатели на алгоритмы или идеи в порядке. Наиболее вероятным случаем будет M = 100000 и N = 8 и часто вызывается.
Просто повторю: мне нужно частичное совпадение (например, item = 011000 matching target = 001000), не точное совпадение. Хотя элементы M известны заранее, возможные значения целей могут быть любыми.
Я, наконец, решил придерживаться грубой силы. Для 80 000 предметов это не стоит ничего делать. Я думаю, если бы размер набора данных был больше чем 800 000 000, это могло бы стоить того.