Struct nekolib::ds::foldable_queue::FoldableQueue
source · pub struct FoldableQueue<M: Monoid> { /* private fields */ }
Expand description
fold 可能キュー。
いわゆる SWAG (Sliding Window Aggregation)。 モノイドを要素とするキューであって、全体のモノイド積を計算できる。 逆元がある演算であれば、単に要素を一つ持って計算すればよい。
Idea
スタックを二つ使ってキューを実現できることを応用する。 モノイド積を管理するスタックも二つ用意する。 後者のスタックそれぞれの top が、対応する前者のスタック中の要素の総積となるように管理する。 これにより、キュー全体としての積は、二つの要素の積として計算できる。
Implementation notes
fold()
だけを考えると front stack には元の値を入れる必要はないが、
pop()
の際の挙動を標準の VecDeque
などと合わせたかったので、含めることにした。
fold した値を返すということにすれば含めなくて済むが、あまりそうしたくなかったので。
Complexity
演算 | 時間計算量 |
---|---|
new | $\Theta(1)$ |
push (push_back ) | $\Theta(1)$ |
pop (pop_front ) | amortized $\Theta(1)$ |
fold | $\Theta(1)$ |
pop
の計算量は、two-stack queue のならし解析から従う。
わかりやすい資料として
CS166
を挙げておく。
Examples
use nekolib::ds::FoldableQueue;
use nekolib::traits::{Fold, Pop, Push};
use nekolib::utils::OpMin;
let mut fq = FoldableQueue::<OpMin<i32>>::new();
assert_eq!(fq.fold(..), std::i32::MAX);
fq.push(6);
assert_eq!(fq.fold(..), 6);
fq.push(3);
assert_eq!(fq.fold(..), 3);
fq.push(4);
assert_eq!(fq.fold(..), 3);
fq.pop();
assert_eq!(fq.fold(..), 3);
fq.pop();
assert_eq!(fq.fold(..), 4);
Implementations§
Trait Implementations§
source§impl<M: Clone + Monoid> Clone for FoldableQueue<M>where
M::Set: Clone,
impl<M: Clone + Monoid> Clone for FoldableQueue<M>where M::Set: Clone,
source§fn clone(&self) -> FoldableQueue<M>
fn clone(&self) -> FoldableQueue<M>
Returns a copy of the value. Read more
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source
. Read moreAuto Trait Implementations§
impl<M> RefUnwindSafe for FoldableQueue<M>where M: RefUnwindSafe, <M as Magma>::Set: RefUnwindSafe,
impl<M> Send for FoldableQueue<M>where M: Send, <M as Magma>::Set: Send,
impl<M> Sync for FoldableQueue<M>where M: Sync, <M as Magma>::Set: Sync,
impl<M> Unpin for FoldableQueue<M>where M: Unpin, <M as Magma>::Set: Unpin,
impl<M> UnwindSafe for FoldableQueue<M>where M: UnwindSafe, <M as Magma>::Set: UnwindSafe,
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