Я реализую алгоритм сокращения матрицы, я студент математики.
Очевидно, я искал и читал по интернету, но не нашел именно то, что искал (в конце я перечисляю то, что я нашел, и статьи, которые я прочитал).
Краткий обзор проблемы:
Битовый вектор b имеет Фиксированную длину N.
b изменяется на каждом шаге (может быть только в нескольких индексах (в большинстве случаев) или в значительно большем количестве индексов (от 1/10 до 1/3), это только в ~ 10% случаев).
У меня уже есть разреженная реализация, теперь я хотел бы закодировать ее, используя некоторую умную реализацию bitvector.
//initialize to 0
b=bitvector(0, n=N)
for i in 1 to N
{some operations on the bitvector b}
get I= { j | b[j] == 1 }
{save I}
Что мне нужно это:
I
на каждом этапе (определенно не более O (logN), в идеале O (1))Что было бы неплохо иметь:
Что мне не нужно, так это:
Я использую библиотеку Sdsl 2.0 Simon Gog et al. (https://github.com/simongog/sdsl-lite) но выберите структуру
bit_vector::select_1_type
стоит O (n) для инициализации, O (1) для каждого запроса, но не «следит» за изменениями в b (верно, я не нашел в этом ничего особенного), что означает, что его нужно инициализировать в каждый шаг после доработок.
Документы, которые я прочитал:
«Быстрый, маленький, простой ранг / выбор на растровых изображениях» (Г. Наварро и Э. Провидель) и «Практический энтропийно-сжатый ранг / выборочный словарь» (Д. Оканохара
К. Садакане) и я был бы признателен за любую ссылку на надежную реализацию в C ++ (если структура удовлетворяет моим требованиям)
Вещи, которые я нашел здесь на stackexchange о похожих темах, которые не помогли:
Извините за длинный вопрос, я надеюсь, что объяснил, что мне нужно, и свою решимость найти его. Я все еще очень озадачен различными вещами, связанными с битвекторами, это определенно не моя область знаний, поэтому любые разъяснения приветствуются.
Заранее спасибо.
Описанная структура Вот это самая близкая вещь, которую я знаю о свойствах, которые вы хотите.
В частности:
Других решений пока нет …