【发布时间】:2020-11-20 14:01:25
【问题描述】:
我有一个Ref<'a, BTreeSet<T>>,我想将其内容的引用作为Vec<Ref<'a, T>>。
一种方法是:
fn get_refs<'a, T: Ord>(btree: Ref<'a, BTreeSet<T>>) -> Vec<Ref<'a, T>> {
let mut result = Vec::new();
for e in btree.iter() {
result.push(Ref::map(Ref::clone(&btree), |t| t.get(&e).unwrap()))
}
result
}
现在让n 成为btree 的大小。
因为从二叉树中获取值需要O(log(n)),并且因为遍历二叉树需要O(n),所以这个方法的时间复杂度是O(n log(n))。
即使使用&'a BTreeSet<T> 和&'a T 而不是Ref<'a, BTreeSet<T>> 和Ref<'a, T> 执行此操作也需要O(n)(因为我们只需要收集在数组中迭代的引用)。以下是使用普通引用的方法示例。
fn get_refs<'a, T: Ord>(btree: &'a BTreeSet<T>) -> Vec<&'a T> {
btree.iter().collect()
}
我的问题是:
给定Ref<'a, BTreeSet<T>>,有没有办法在O(n) 时间复杂度中获得Vec<Ref<'a, T>>?
【问题讨论】:
-
如果您非常关心复杂性,那么从一开始就拥有两种数据结构并使用集合来获取项目并使用向量来迭代它们可能是合适的。当你添加一个项目时,你对两个结构都这样做,所以添加仍然是摊销 O(log N)
标签: rust reference time-complexity refcell