Struct nekolib::ds::foldable_deque::FoldableDeque
source · pub struct FoldableDeque<M: Monoid> { /* private fields */ }
Expand description
fold 可能両端キュー。
モノイドを要素とする両端キューであって、全体のモノイド積を計算できる。 逆元がある演算であれば、単に要素を一つ持って計算すればよい。
Idea
スタックを二つ使って両端キューを実現できることを応用する1。
モノイド積に関する方針は FoldableQueue
と同じ。
Complexity
演算 | 時間計算量 |
---|---|
new | $\Theta(1)$ |
push_back , push_front | $\Theta(1)$ |
pop_back , pop_front | amortized $\Theta(1)$ |
fold | $\Theta(1)$ |
キューを実現する場合と異なり、pop したい側の stack が空の際は、 他方の stack から半分(奇数なら切り上げ)だけ要素をもらってくるようにする。 各スタックの要素数の差の絶対値をポテンシャルとすることで、ならし定数時間が示せる。
Examples
use nekolib::ds::FoldableDeque;
use nekolib::traits::{Fold, PopBack, PopFront, PushBack, PushFront};
use nekolib::utils::OpMin;
let mut fq = FoldableDeque::<OpMin<i32>>::new();
assert_eq!(fq.fold(..), std::i32::MAX);
fq.push_back(6);
assert_eq!(fq.fold(..), 6);
fq.push_back(3);
assert_eq!(fq.fold(..), 3);
fq.push_front(4);
assert_eq!(fq.fold(..), 3);
fq.pop_back();
assert_eq!(fq.fold(..), 4);
fq.pop_front();
assert_eq!(fq.fold(..), 6);
fq.pop_back();
assert_eq!(fq.fold(..), std::i32::MAX);
内部的には
std::VecDeque
を使ってスタックを実現しているため、 両端キュー二つで両端キューを実現していることになっている。ギャグ? ↩
Implementations§
Trait Implementations§
source§impl<M: Clone + Monoid> Clone for FoldableDeque<M>where
M::Set: Clone,
impl<M: Clone + Monoid> Clone for FoldableDeque<M>where M::Set: Clone,
source§fn clone(&self) -> FoldableDeque<M>
fn clone(&self) -> FoldableDeque<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 FoldableDeque<M>where M: RefUnwindSafe, <M as Magma>::Set: RefUnwindSafe,
impl<M> Send for FoldableDeque<M>where M: Send, <M as Magma>::Set: Send,
impl<M> Sync for FoldableDeque<M>where M: Sync, <M as Magma>::Set: Sync,
impl<M> Unpin for FoldableDeque<M>where M: Unpin, <M as Magma>::Set: Unpin,
impl<M> UnwindSafe for FoldableDeque<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