Safe Haskell | Safe-Inferred |
---|---|
Language | GHC2021 |
A fast, mutable multiset for Int
keys backed by a HashMap
. Most operations are performed
in \(O(1)\) time, but in average.
Invariant
The count for each key must be non-negative. An exception is thrown if this invariant is violated.
Capacity limitation
The maximum number of distinct keys that can be inserted is fixed at \(n\), even if some keys are
deleted. This is due to the limitation of the internal HashMap
.
Example
Create a MultiSet
with capacity \(4\):
>>>
import AtCoder.Extra.MultiSet qualified as MS
>>>
ms <- MS.new 4
inc
and dec
are the primary API:
>>>
MS.inc ms 10
>>>
MS.inc ms 10
>>>
MS.lookup ms 10
Just 2
>>>
MS.dec ms 10
>>>
MS.lookup ms 10
Just 1
Entries with zero count are considered to be non-existing:
>>>
MS.dec ms 10
>>>
MS.member ms 10
False
>>>
MS.lookup ms 10
Nothing
>>>
MS.size ms
0
Creating a negative count results in an exception:
>>>
MS.inc ms 11
>>>
MS.sub ms 11 2
*** Exception: AtCoder.Extra.Multiset.sub: the count of `11` is becoming a negative value: `-1` ...
Decrementing a non-existing key does nothing and does not throw an exception:
>>>
MS.dec ms 12
Misc:
>>>
MS.insert ms 12 112
>>>
MS.assocs ms
[(11,1),(12,112)]
Since: 1.1.0.0
Synopsis
- data MultiSet s
- new :: PrimMonad m => Int -> m (MultiSet (PrimState m))
- capacity :: MultiSet s -> Int
- size :: PrimMonad m => MultiSet (PrimState m) -> m Int
- lookup :: PrimMonad m => MultiSet (PrimState m) -> Int -> m (Maybe Int)
- member :: PrimMonad m => MultiSet (PrimState m) -> Int -> m Bool
- notMember :: PrimMonad m => MultiSet (PrimState m) -> Int -> m Bool
- inc :: (HasCallStack, PrimMonad m) => MultiSet (PrimState m) -> Int -> m ()
- dec :: (HasCallStack, PrimMonad m) => MultiSet (PrimState m) -> Int -> m ()
- add :: (HasCallStack, PrimMonad m) => MultiSet (PrimState m) -> Int -> Int -> m ()
- sub :: (HasCallStack, PrimMonad m) => MultiSet (PrimState m) -> Int -> Int -> m ()
- insert :: (HasCallStack, PrimMonad m) => MultiSet (PrimState m) -> Int -> Int -> m ()
- delete :: (HasCallStack, PrimMonad m) => MultiSet (PrimState m) -> Int -> m ()
- keys :: PrimMonad m => MultiSet (PrimState m) -> m (Vector Int)
- elems :: PrimMonad m => MultiSet (PrimState m) -> m (Vector Int)
- assocs :: PrimMonad m => MultiSet (PrimState m) -> m (Vector (Int, Int))
- unsafeKeys :: PrimMonad m => MultiSet (PrimState m) -> m (Vector Int)
- unsafeElems :: PrimMonad m => MultiSet (PrimState m) -> m (Vector Int)
- unsafeAssocs :: PrimMonad m => MultiSet (PrimState m) -> m (Vector (Int, Int))
MultiSet
Construtors
new :: PrimMonad m => Int -> m (MultiSet (PrimState m)) Source #
\(O(n)\) Creates a MultiSet
with capacity \(n\).
Since: 1.1.0.0
Metadata
capacity :: MultiSet s -> Int Source #
\(O(1)\) Returns the maximum number of distinct keys that can be inserted into the internal hash map.
Since: 1.1.0.0
size :: PrimMonad m => MultiSet (PrimState m) -> m Int Source #
\(O(1)\) Returns the number of distinct keys with positive counts.
Since: 1.1.0.0
Lookups
lookup :: PrimMonad m => MultiSet (PrimState m) -> Int -> m (Maybe Int) Source #
\(O(1)\) Looks up the count for a key.
Since: 1.1.0.0
member :: PrimMonad m => MultiSet (PrimState m) -> Int -> m Bool Source #
\(O(1)\) Tests whether \(k\) is in the set.
Since: 1.1.0.0
notMember :: PrimMonad m => MultiSet (PrimState m) -> Int -> m Bool Source #
\(O(1)\) Tests whether \(k\) is not in the set.
Since: 1.1.0.0
Modifications
inc :: (HasCallStack, PrimMonad m) => MultiSet (PrimState m) -> Int -> m () Source #
\(O(1)\) Increments the count of a key.
Since: 1.1.0.0
dec :: (HasCallStack, PrimMonad m) => MultiSet (PrimState m) -> Int -> m () Source #
\(O(1)\) Decrements the count of a key.
Since: 1.1.0.0
add :: (HasCallStack, PrimMonad m) => MultiSet (PrimState m) -> Int -> Int -> m () Source #
\(O(1)\) Increments the count of a key \(k\) by \(c\). If the key does not exist in the set,
the \((k, c)\) pair is inserted. If \(v\) is negative, it falls back to sub
.
Since: 1.1.0.0
sub :: (HasCallStack, PrimMonad m) => MultiSet (PrimState m) -> Int -> Int -> m () Source #
\(O(1)\) Decrements the count of a key \(k\) by \(c\). If \(c\) is negative, it falls back to
add
.
Since: 1.1.0.0
insert :: (HasCallStack, PrimMonad m) => MultiSet (PrimState m) -> Int -> Int -> m () Source #
\(O(1)\) Inserts a key-count pair into the set. MultiSet
is actually a count map.
Since: 1.1.0.0
delete :: (HasCallStack, PrimMonad m) => MultiSet (PrimState m) -> Int -> m () Source #
\(O(1)\) Deletes a key. Note that it does not undo its insertion and does not increase the number of distinct keys that can be inserted into the internal hash map.
Since: 1.1.0.0
Conversions
Safe conversions
keys :: PrimMonad m => MultiSet (PrimState m) -> m (Vector Int) Source #
\(O(n)\) Enumerates the keys in the set.
Since: 1.1.0.0
elems :: PrimMonad m => MultiSet (PrimState m) -> m (Vector Int) Source #
\(O(n)\) Enumerates the counts in the set.
Since: 1.1.0.0
assocs :: PrimMonad m => MultiSet (PrimState m) -> m (Vector (Int, Int)) Source #
\(O(n)\) Enumerates the key-count pairs in the set.
Since: 1.1.0.0
Unsafe conversions
unsafeKeys :: PrimMonad m => MultiSet (PrimState m) -> m (Vector Int) Source #
\(O(n)\) Enumerates the keys in the set.
Since: 1.1.0.0