Эффективный способ справиться добавление и удаление элементов на битовую

Итак, предположим, что у вас есть коллекция предметов. Каждый элемент имеет идентификатор, который может быть представлен через битовое поле. В качестве простого примера предположим, что вашей коллекции:0110, 0111, 1001, 1011, 1110, 1111

Итак, вы хотите что-то написать функцию, Remove(bool bitval, int position). Например, вызов Remove(0, 2) удалить все элементы, где индекс 2(т.е. 3 бита) 0. В этом случае, что бы 1001, только. Remove(1,1) удалить 1110, 1111, 0111, и 0110. Это тривиально, чтобы придумать O(n) сбор, где это возможно (просто использовать связанный список), где n-количество элементов в коллекции. В целом число элементов, которые будут удалены будет O(n) (если данный бит имеет > = c% шансов быть 1 и > = c% шансов 0, где c-некоторая константа > 0), так что "лучше" алгоритмы, которые по каким-O(l), l-число элементов удалены, безжизненной.

можно ли определить структуру данных, где средняя (или, еще лучше, в худшем случае) удаления время лучше, чем O(n)? Двоичное дерево может сделать очень хорошо (просто удалить все левой/правой ветви на высоте m, где m-индекс тестируется), но я интересно, если есть какой-то способ сделать лучше (и, если честно, я не знаю, как устранить все левой или правой ветви на определенной высоте эффективно). Кроме того, есть доказательства, что лучше делать это не возможно?

Edit: я не уверен в точности то, что я ожидаю, что с точки зрения эффективности (извините Арно), но основное объяснение возможно применение образом: Предположим, что мы работаем с двоичном дереве принятия решений. Такого дерева может быть использован для игры дерево или puzzle solver или что угодно. Далее предположим, что дерево достаточно мала, что мы можем вместить всех конечных узлов в памяти. Каждый такой узел, в основном, просто битовое поле со списком всех решений. Теперь, если мы хотим, чтобы очистить от произвольных решений от этого дерева, один способ-это просто прыжок в высоту, на которой, в частности, решение принято, и чернослива левой или правой стороне на каждый узел (слева означает одно решение, в правой другой смысл). Обычно в дереве принятия решений требуется только подрезать ветви, в то время (с родителем, что поддерева отличается от родительской других поддеревьев, и, соответственно, решение которых должны быть обрезаны в одно поддерево не должны быть обрезаны от других), но в некоторых ситуациях это может быть не так. Далее, вы, как правило, только хочу, чтобы обрезать все, что ниже определенного узла, но в этом случае вы будете оставляя некоторые вещи ниже узла, а также обрезки ниже остальных узлов в дереве.

во Всяком случае, это несколько вопроса на основе любопытство; я не уверен, что это практично использовать какие-либо результаты, но интересует то, что говорят люди.

Редактировать:Думая об этом, я считаю, что дерево метод фактически O(n / logn), при условии, что это достаточно плотные. Доказательство:Предположим, у вас есть бинарное дерево с n элементов. Ее высота составляет log(n). Удаление половины нижней потребует n/2 поглощений. Снятие половину строк выше, потребует n/4. Сумма операций для каждой строки-n-1. Так, среднее число поглощений, n-1) / log(n).

Найдено 4 ответа:

Efficient way to handle adding and removing items by bitwise And

http://stackoverflow.com/questions/937719/efficient-way-to-handle-adding-and-removing-items-by-bitwise-and

Посмотреть решение →