выбрать на битовый вектор в C ++ сложности и реализации

Я реализую алгоритм сокращения матрицы, я студент математики.
Очевидно, я искал и читал по интернету, но не нашел именно то, что искал (в конце я перечисляю то, что я нашел, и статьи, которые я прочитал).

Краткий обзор проблемы:

  • Битовый вектор 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}
    

Что мне нужно это:

  • быстро установить b [i] = 1 или = 0 (возможно, O (1))
  • быстро получить набор индексов I на каждом этапе (определенно не более O (logN), в идеале O (1))
  • библиотека C ++, которая позволяет это
  • документы / документы

Что было бы неплохо иметь:

  • быстрый способ получить «низший» (последний индекс установлен в 1, а именно select (rank (b)), если обе операции выполняются быстро (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 о похожих темах, которые не помогли:

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

Заранее спасибо.

3

Решение

Описанная структура Вот это самая близкая вещь, которую я знаю о свойствах, которые вы хотите.

В частности:

  • инициализация постоянное время
  • установка / очистка записей является постоянным временем
  • тестирование на членство постоянное время
  • получение набора записей — это O (N) по количеству записей (если вы не нуждаетесь в их сортировке — на самом деле вы в конечном итоге перебираете их в порядке вставки; вы не собираетесь делать лучше, чем O (N) в целом) если вам нужно обойти их всех, что бы ни случилось дальше, конечно)
1

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

Других решений пока нет …