pub struct RsDict { /* private fields */ }
Expand description
rank/select 辞書。
要素が 0
/1
からなる配列で、任意区間の 0
/1
の個数を数えられる。
Idea
要素数 $n$ のビット配列に対して、rank/select のクエリはそれぞれ $n+1$ 通りしかないので、それらを $O(n)$ 時間で前計算しておけば、$3n+O(1)$ words で $O(1)$ query time を実現できる1。
しかし、wavelet matrix などに用いる際はこれを 64 本持ったりする必要があることから、 空間を削減できた方がうれしそうなので、$6n/w+O(1)$ words, $O(\log(w))$ query time の方法を用いた2。
rank については、$w$ bits ごとに求めた個数の累積和 ($n/w$ words) を用いる。 端数については word size の popcount を行う3。
select については 0
と 1
に対して用意する必要があり、以下では 1
のみ述べるが、
0
についても mutatis mutandis でできる。
まず、1
の $w$ 個おきの出現箇所を求める (at most $n/w$ words)。このうち、幅が
$w^2$ 以上であるものを “疎” と呼び、そうでないところを “密” と呼ぶ。
疎である区間は高々 $n/w^2$ 個しかないので、その出現位置を陽に持っても $n/w$
words で抑えられる。また、密である区間については、区間幅が $w^2$ 未満なので、
クエリごとに二分探索しても $\log(w)$ time で抑えられる。
Complexity
$O(n)$ preprocess, $O(n/w)$ space, $O(\log(w))$ query time.
Implementations§
Trait Implementations§
Auto Trait Implementations§
impl RefUnwindSafe for RsDict
impl Send for RsDict
impl Sync for RsDict
impl Unpin for RsDict
impl UnwindSafe for RsDict
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more