Skip to content

Commit 21bbca5

Browse files
committed
docs: complete public api rustdoc
1 parent 2769d94 commit 21bbca5

13 files changed

Lines changed: 956 additions & 0 deletions

docs/02-linked-list.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,14 @@ un puntero crudo exigiría `unsafe`, y una solución con `Rc<RefCell<_>>` cambia
316316
modelo de ownership. Un `VecDeque` puede ser la estructura práctica correcta si
317317
solo necesitas una cola eficiente en ambos extremos.
318318

319+
## Conexiones con cursos futuros
320+
321+
En `rust-algorithms`, las listas enlazadas reaparecen como representación mental
322+
para recorridos, ventanas y técnicas de punteros. La lección que se arrastra no
323+
es que una lista enlazada sea "mejor" que un vector, sino que la forma de enlazar
324+
nodos cambia las operaciones disponibles, la localidad de memoria y las
325+
invariantes que un algoritmo puede asumir.
326+
319327
## Referencias
320328

321329
- Donald Knuth, *The Art of Computer Programming*, Vol. 1, secciones sobre

src/bloom_filter.rs

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,17 @@ use std::collections::hash_map::DefaultHasher;
77
use 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)]
1122
pub 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

3953
impl 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

Comments
 (0)