Skip to main content

random_b_tree_sets

Function random_b_tree_sets 

Source
pub fn random_b_tree_sets<I: Iterator>(
    seed: Seed,
    xs_gen: &dyn Fn(Seed) -> I,
    mean_length_numerator: u64,
    mean_length_denominator: u64,
) -> RandomBTreeSets<I::Item, GeometricRandomNaturalValues<u64>, I> 
where I::Item: Ord,
Expand description

Generates random BTreeSets using elements from an iterator.

The lengths of the BTreeSets are sampled from a geometric distribution with a specified mean $m$, equal to mean_length_numerator / mean_length_denominator. $m$ must be greater than 0.

Strictly speaking, the input iterator must generate infinitely many distinct elements. In practice it only needs to generate $k$ distinct elements, where $k$ is the largest length actually sampled from the geometric distribution. For example, if mean_length_numerator / mean_length_denominator is significantly lower than 256, then it’s ok to use random_unsigneds::<u8>.

$$ P((x_i)_{i=0}^{n-1}) = n!P_g(n)\prod_{i=0}^{n-1}P(x_i), $$ where $P_g(n)$ is the probability function described in geometric_random_unsigneds.

xs_gen must be infinite.

§Expected complexity per iteration

$T(i) = O(m \log m T^\prime(i))$

$M(i) = O(m M^\prime(i))$

where $T$ is time, $M$ is additional memory, $i$ is the iteration number, $T^\prime$ and $M^\prime$ are the time and memory functions of xs, and $m$ is mean_length_numerator / mean_length_denominator.

§Panics

Panics if mean_length_numerator or mean_length_denominator are zero, or, if after being reduced to lowest terms, their sum is greater than or equal to $2^{64}$.

§Examples

use itertools::Itertools;
use malachite_base::num::random::random_primitive_ints;
use malachite_base::random::EXAMPLE_SEED;
use malachite_base::sets::random::random_b_tree_sets;
use maplit::btreeset;

let xs = random_b_tree_sets(EXAMPLE_SEED, &random_primitive_ints::<u8>, 4, 1);
let values = xs.take(20).collect_vec();
assert_eq!(
    values,
    &[
        btreeset! {},
        btreeset! {11, 32, 38, 85, 134, 136, 162, 166, 177, 200, 203, 217, 223, 235},
        btreeset! {30, 90, 218, 234},
        btreeset! {9, 106, 204, 216},
        btreeset! {151},
        btreeset! {},
        btreeset! {78, 91, 97, 213, 253},
        btreeset! {39, 191},
        btreeset! {170, 175, 232, 233},
        btreeset! {},
        btreeset! {2, 22, 35, 114, 198, 217},
        btreeset! {},
        btreeset! {},
        btreeset! {17, 25, 32, 65, 79, 114, 121, 144, 148, 173, 222},
        btreeset! {52, 69, 73, 91, 115, 137, 153, 178},
        btreeset! {},
        btreeset! {34, 95, 112},
        btreeset! {},
        btreeset! {106, 130, 167, 168, 197},
        btreeset! {86, 101, 122, 150, 172, 177, 207, 218, 221}
    ]
);