Каждый элемент в матрице B представляет собой матрицу 10 на 10, где все записи равны 1 или 0.
Хорошо, это означает, что он может быть представлен 100-битным числом.Давайте округлим это до 128 бит (шестнадцати байтов).
Один из подходов состоит в том, чтобы использовать связанные списки - создать структуру наподобие (в C):
typedef struct sNode {
unsigned char bits[16];
struct sNode *next;
};
и поддерживать весь список B
как отсортированный связанный список.
Производительность будет несколько ниже (a) , чем использование 100-битного числа в качестве индекса массива для действительно огромного (до невозможного).учитывая размер известного юниверса) массива.
Когда придет время вставить новый элемент в B
, вставьте его в желаемое положение (перед тем, которое равно или больше).Если он был совершенно новым (вы узнаете это, если тот, который вы вставляете раньше, отличается), также добавьте его в A
.
(a) Хотя, вероятно, это не так уж и сложно - есть варианты, которые можно использовать для повышения скорости.
Одна из возможностей - использовать пропускаемые списки для более быстрого обхода во время поиска.Это еще один указатель, который ссылается не на следующий элемент, а на один 10 (или 100 или 1000) элементов.Таким образом, вы можете достаточно быстро приблизиться к нужному элементу и просто выполнить одношаговый поиск после этой точки.
В качестве альтернативы, поскольку вы говорите о битах, вы можете разделить B
на (например,) 1024 под- B
списков.Используйте первые 10 битов 100-битного значения, чтобы выяснить, какой суб B
вам нужно использовать, и сохраните только следующие 90 бит.Одно это увеличило бы скорость поиска в среднем на 1000 (используйте больше начальных битов и больше суб B
с, если вам нужно улучшить это).
Вы также можете использовать хэш для 100-битного значениячтобы сгенерировать ключ меньшего размера, который вы можете использовать в качестве индекса в массиве / списке, но я не думаю, что это даст вам какое-либо реальное преимущество над методом из предыдущего абзаца.