@@ -7,6 +7,17 @@ use std::collections::hash_map::DefaultHasher;
77use std:: hash:: { Hash , Hasher } ;
88
99/// Error al crear un filtro de Bloom.
10+ ///
11+ /// Complejidad: construir o comparar este error cuesta O(1).
12+ ///
13+ /// ```
14+ /// use rust_data_structures::bloom_filter::{BloomFilter, BloomFilterError};
15+ ///
16+ /// assert!(matches!(
17+ /// BloomFilter::new(0, 3),
18+ /// Err(BloomFilterError::InvalidBitCount)
19+ /// ));
20+ /// ```
1021#[ derive( Debug , Clone , Copy , PartialEq , Eq ) ]
1122pub enum BloomFilterError {
1223 /// El numero de bits debe ser mayor que cero.
@@ -21,6 +32,9 @@ pub enum BloomFilterError {
2132
2233/// Filtro de Bloom para pertenencia probabilistica.
2334///
35+ /// Complejidad: insertar y consultar cuesta O(k), donde `k` es el numero de
36+ /// hashes configurados.
37+ ///
2438/// ```
2539/// use rust_data_structures::bloom_filter::BloomFilter;
2640///
@@ -38,6 +52,16 @@ pub struct BloomFilter {
3852
3953impl BloomFilter {
4054 /// Crea un filtro con numero de bits y hashes especifico.
55+ ///
56+ /// Complejidad: O(m), donde `m` es el numero de bits inicializados.
57+ ///
58+ /// ```
59+ /// use rust_data_structures::bloom_filter::BloomFilter;
60+ ///
61+ /// let filter = BloomFilter::new(64, 3).unwrap();
62+ /// assert_eq!(filter.bit_count(), 64);
63+ /// assert_eq!(filter.hash_count(), 3);
64+ /// ```
4165 pub fn new ( bit_count : usize , hash_count : usize ) -> Result < Self , BloomFilterError > {
4266 if bit_count == 0 {
4367 return Err ( BloomFilterError :: InvalidBitCount ) ;
@@ -54,6 +78,16 @@ impl BloomFilter {
5478 }
5579
5680 /// Crea un filtro a partir de elementos esperados y tasa objetivo.
81+ ///
82+ /// Complejidad: O(m), donde `m` es el numero de bits calculados.
83+ ///
84+ /// ```
85+ /// use rust_data_structures::bloom_filter::BloomFilter;
86+ ///
87+ /// let filter = BloomFilter::with_estimated_items(100, 0.01).unwrap();
88+ /// assert!(filter.bit_count() > 0);
89+ /// assert!(filter.hash_count() > 0);
90+ /// ```
5791 pub fn with_estimated_items (
5892 expected_items : usize ,
5993 false_positive_rate : f64 ,
@@ -76,6 +110,16 @@ impl BloomFilter {
76110 /// Inserta un valor.
77111 ///
78112 /// Complejidad: O(k), donde `k` es el numero de hashes.
113+ ///
114+ /// ```
115+ /// use rust_data_structures::bloom_filter::BloomFilter;
116+ ///
117+ /// let mut filter = BloomFilter::new(64, 3).unwrap();
118+ /// filter.insert(&"key");
119+ ///
120+ /// assert!(filter.might_contain(&"key"));
121+ /// assert_eq!(filter.inserted_count(), 1);
122+ /// ```
79123 pub fn insert < T : Hash > ( & mut self , value : & T ) {
80124 let indexes = self . indexes ( value) ;
81125 for index in indexes {
@@ -89,6 +133,14 @@ impl BloomFilter {
89133 /// Devuelve `true` si el valor podria estar presente.
90134 ///
91135 /// Complejidad: O(k).
136+ ///
137+ /// ```
138+ /// use rust_data_structures::bloom_filter::BloomFilter;
139+ ///
140+ /// let filter = BloomFilter::new(64, 3).unwrap();
141+ ///
142+ /// assert!(!filter.might_contain(&"missing"));
143+ /// ```
92144 #[ must_use]
93145 pub fn might_contain < T : Hash > ( & self , value : & T ) -> bool {
94146 self . indexes ( value)
@@ -97,36 +149,96 @@ impl BloomFilter {
97149 }
98150
99151 /// Limpia todos los bits y reinicia el contador educativo.
152+ ///
153+ /// Complejidad: O(m), donde `m` es el numero de bits.
154+ ///
155+ /// ```
156+ /// use rust_data_structures::bloom_filter::BloomFilter;
157+ ///
158+ /// let mut filter = BloomFilter::new(64, 3).unwrap();
159+ /// filter.insert(&"key");
160+ /// filter.clear();
161+ ///
162+ /// assert_eq!(filter.inserted_count(), 0);
163+ /// assert_eq!(filter.set_bit_count(), 0);
164+ /// ```
100165 pub fn clear ( & mut self ) {
101166 self . bits . fill ( false ) ;
102167 self . inserted_count = 0 ;
103168 }
104169
105170 /// Devuelve el numero de bits.
171+ ///
172+ /// Complejidad: O(1).
173+ ///
174+ /// ```
175+ /// use rust_data_structures::bloom_filter::BloomFilter;
176+ ///
177+ /// let filter = BloomFilter::new(32, 2).unwrap();
178+ /// assert_eq!(filter.bit_count(), 32);
179+ /// ```
106180 #[ must_use]
107181 pub fn bit_count ( & self ) -> usize {
108182 self . bits . len ( )
109183 }
110184
111185 /// Devuelve el numero de hashes simulados.
186+ ///
187+ /// Complejidad: O(1).
188+ ///
189+ /// ```
190+ /// use rust_data_structures::bloom_filter::BloomFilter;
191+ ///
192+ /// let filter = BloomFilter::new(32, 2).unwrap();
193+ /// assert_eq!(filter.hash_count(), 2);
194+ /// ```
112195 #[ must_use]
113196 pub fn hash_count ( & self ) -> usize {
114197 self . hash_count
115198 }
116199
117200 /// Devuelve cuantas inserciones se han realizado.
201+ ///
202+ /// Complejidad: O(1).
203+ ///
204+ /// ```
205+ /// use rust_data_structures::bloom_filter::BloomFilter;
206+ ///
207+ /// let mut filter = BloomFilter::new(32, 2).unwrap();
208+ /// filter.insert(&"a");
209+ /// assert_eq!(filter.inserted_count(), 1);
210+ /// ```
118211 #[ must_use]
119212 pub fn inserted_count ( & self ) -> usize {
120213 self . inserted_count
121214 }
122215
123216 /// Devuelve cuantos bits estan encendidos.
217+ ///
218+ /// Complejidad: O(m), donde `m` es el numero de bits.
219+ ///
220+ /// ```
221+ /// use rust_data_structures::bloom_filter::BloomFilter;
222+ ///
223+ /// let mut filter = BloomFilter::new(32, 2).unwrap();
224+ /// filter.insert(&"a");
225+ /// assert!(filter.set_bit_count() > 0);
226+ /// ```
124227 #[ must_use]
125228 pub fn set_bit_count ( & self ) -> usize {
126229 self . bits . iter ( ) . filter ( |bit| * * bit) . count ( )
127230 }
128231
129232 /// Estima la tasa de falso positivo con el estado actual.
233+ ///
234+ /// Complejidad: O(1).
235+ ///
236+ /// ```
237+ /// use rust_data_structures::bloom_filter::BloomFilter;
238+ ///
239+ /// let filter = BloomFilter::new(32, 2).unwrap();
240+ /// assert_eq!(filter.estimated_false_positive_rate(), 0.0);
241+ /// ```
130242 #[ must_use]
131243 pub fn estimated_false_positive_rate ( & self ) -> f64 {
132244 if self . inserted_count == 0 {
0 commit comments