pub struct Frequencies<T> { /* private fields */ }Expand description
A commutative data structure for exact frequency counts.
Implementations§
Source§impl<T: Eq + Hash> Frequencies<T>
impl<T: Eq + Hash> Frequencies<T>
Sourcepub fn new() -> Frequencies<T>
pub fn new() -> Frequencies<T>
Create a new frequency table with no samples.
pub fn with_capacity(capacity: usize) -> Self
Sourcepub fn cardinality(&self) -> u64
pub fn cardinality(&self) -> u64
Return the cardinality (number of unique elements) in the data.
Sourcepub fn most_frequent(&self) -> (Vec<(&T, u64)>, u64)
pub fn most_frequent(&self) -> (Vec<(&T, u64)>, u64)
Return a Vec of elements, their corresponding counts in
descending order, and the total count.
Sourcepub fn least_frequent(&self) -> (Vec<(&T, u64)>, u64)
pub fn least_frequent(&self) -> (Vec<(&T, u64)>, u64)
Return a Vec of elements, their corresponding counts in
ascending order, and the total count.
Sourcepub fn par_frequent(&self, least: bool) -> (Vec<(&T, u64)>, u64)
pub fn par_frequent(&self, least: bool) -> (Vec<(&T, u64)>, u64)
Return a Vec of elements, their corresponding counts in order
based on the least parameter, and the total count. Uses parallel sort.
Sourcepub fn unique_values(&self) -> UniqueValues<'_, T> ⓘ
pub fn unique_values(&self) -> UniqueValues<'_, T> ⓘ
Return an iterator over the unique values of the data.
Sourcepub fn top_n(&self, n: usize) -> Vec<(&T, u64)>where
T: Ord,
pub fn top_n(&self, n: usize) -> Vec<(&T, u64)>where
T: Ord,
Get the top N most frequent items without sorting the entire vector
This is much faster than most_frequent() when you only need a few items
Sourcepub fn bottom_n(&self, n: usize) -> Vec<(&T, u64)>where
T: Ord,
pub fn bottom_n(&self, n: usize) -> Vec<(&T, u64)>where
T: Ord,
Similar to top_n but for least frequent items
Sourcepub fn items_with_count(&self, n: u64) -> Vec<&T>
pub fn items_with_count(&self, n: u64) -> Vec<&T>
Get items with exactly n occurrences
Sourcepub fn total_count(&self) -> u64
pub fn total_count(&self) -> u64
Get the sum of all counts
Sourcepub fn increment_by(&mut self, v: T, count: u64)
pub fn increment_by(&mut self, v: T, count: u64)
Add specialized method for single increment
Source§impl<T: Eq + Hash + Ord + Clone + Send + Sync> Frequencies<T>
impl<T: Eq + Hash + Ord + Clone + Send + Sync> Frequencies<T>
Sourcepub fn modes_antimodes(&self) -> ((Vec<T>, usize, u32), (Vec<T>, usize, u32))
pub fn modes_antimodes(&self) -> ((Vec<T>, usize, u32), (Vec<T>, usize, u32))
Returns the modes and antimodes of the data.
Produces results identical to crate::Unsorted::modes_antimodes for the
same multiset of samples with per-value counts <= u32::MAX (verified by
the modes_antimodes_matches_unsorted property test and the equivalence
assertion in benches/modesfreq.rs). Above that the two diverge:
selection here is exact via full u64 counts, while Unsorted tracks
u32 run counts (and cannot practically hold that many samples anyway).
Rather than sorting all unique values, this only sorts what the output
actually contains: one O(c) pass over the counts finds the
highest/lowest occurrence counts, a second pass collects only the
matching keys, then the (typically tiny) mode set is sorted and the 10
smallest antimodes are picked via select_nth_unstable - O(c) average
instead of O(c log c), where c is the cardinality. Uniform-count data
(highest == lowest: every value is both a mode and an antimode) falls
back to a single full key sort, which beats collecting the keys twice.
Counts are compared as u64, so mode/antimode selection is exact even
when occurrence counts exceed u32::MAX; only the returned occurrence
counts saturate at u32::MAX.
Returns ((modes, modes_count, mode_occurrences), (antimodes, antimodes_count, antimode_occurrences)).
Only the first 10 antimodes are returned.
Source§impl Frequencies<Vec<u8>>
impl Frequencies<Vec<u8>>
Sourcepub fn add_borrowed(&mut self, v: &[u8])
pub fn add_borrowed(&mut self, v: &[u8])
Increment count for a byte slice key, avoiding allocation when key exists.
Uses hashbrown’s entry_ref(&[u8]), which probes once with the borrowed
key and only allocates ([u8]::to_owned() -> Vec<u8>) on the vacant
branch. For low-cardinality columns (the common case), this eliminates
~99% of allocations; for new keys it is a single hash+probe (std’s
HashMap has no stable raw-entry API, so the old path hashed twice).
Sourcepub fn increment_by_borrowed(&mut self, v: &[u8], count: u64)
pub fn increment_by_borrowed(&mut self, v: &[u8], count: u64)
Increment by a count for a byte slice key, avoiding allocation when key exists.
Sourcepub fn add_borrowed_capped(&mut self, v: &[u8], cap: u64) -> bool
pub fn add_borrowed_capped(&mut self, v: &[u8], cap: u64) -> bool
Increment the count for v, enforcing a cardinality cap.
Existing keys always increment (the map doesn’t grow). A NEW key that
would grow the map past cap unique entries is rejected: the map is
left unchanged and false is returned, so the caller can drop the
tracker. cap == 0 means unbounded.
Like Self::add_borrowed, this single-probes via entry_ref and
only allocates an owned key on the (admitted) vacant branch.
Trait Implementations§
Source§impl<T: Clone> Clone for Frequencies<T>
impl<T: Clone> Clone for Frequencies<T>
Source§fn clone(&self) -> Frequencies<T>
fn clone(&self) -> Frequencies<T>
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl<T: Debug + Eq + Hash> Debug for Frequencies<T>
Available on debug-assertions enabled only.
impl<T: Debug + Eq + Hash> Debug for Frequencies<T>
Source§impl<T: Eq + Hash> Default for Frequencies<T>
impl<T: Eq + Hash> Default for Frequencies<T>
Source§fn default() -> Frequencies<T>
fn default() -> Frequencies<T>
Source§impl<'de, T> Deserialize<'de> for Frequencies<T>
impl<'de, T> Deserialize<'de> for Frequencies<T>
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl<T: Eq + Hash> Extend<T> for Frequencies<T>
impl<T: Eq + Hash> Extend<T> for Frequencies<T>
Source§fn extend<I: IntoIterator<Item = T>>(&mut self, it: I)
fn extend<I: IntoIterator<Item = T>>(&mut self, it: I)
Source§fn extend_one(&mut self, item: A)
fn extend_one(&mut self, item: A)
extend_one)Source§fn extend_reserve(&mut self, additional: usize)
fn extend_reserve(&mut self, additional: usize)
extend_one)Source§impl<T: Eq + Hash> FromIterator<T> for Frequencies<T>
impl<T: Eq + Hash> FromIterator<T> for Frequencies<T>
Source§fn from_iter<I: IntoIterator<Item = T>>(it: I) -> Frequencies<T>
fn from_iter<I: IntoIterator<Item = T>>(it: I) -> Frequencies<T>
Auto Trait Implementations§
impl<T> Freeze for Frequencies<T>
impl<T> RefUnwindSafe for Frequencies<T>where
T: RefUnwindSafe,
impl<T> Send for Frequencies<T>where
T: Send,
impl<T> Sync for Frequencies<T>where
T: Sync,
impl<T> Unpin for Frequencies<T>where
T: Unpin,
impl<T> UnsafeUnpin for Frequencies<T>
impl<T> UnwindSafe for Frequencies<T>where
T: 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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more