【问题标题】:Efficiently get Vec<Ref<'a, T>> from Ref<'a, BTreeSet<T>>从 Ref<'a, BTreeSet<T>> 有效地获取 Vec<Ref<'a, T>>
【发布时间】:2020-11-20 14:01:25
【问题描述】:

我有一个Ref&lt;'a, BTreeSet&lt;T&gt;&gt;,我想将其内容的引用作为Vec&lt;Ref&lt;'a, T&gt;&gt;
一种方法是:

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
}

A running example

现在让n 成为btree 的大小。
因为从二叉树中获取值需要O(log(n)),并且因为遍历二叉树需要O(n),所以这个方法的时间复杂度是O(n log(n))

即使使用&amp;'a BTreeSet&lt;T&gt;&amp;'a T 而不是Ref&lt;'a, BTreeSet&lt;T&gt;&gt;Ref&lt;'a, T&gt; 执行此操作也需要O(n)(因为我们只需要收集在数组中迭代的引用)。以下是使用普通引用的方法示例。

fn get_refs<'a, T: Ord>(btree: &'a BTreeSet<T>) -> Vec<&'a T> {
    btree.iter().collect()
}

A running example

我的问题是:
给定Ref&lt;'a, BTreeSet&lt;T&gt;&gt;,有没有办法在O(n) 时间复杂度中获得Vec&lt;Ref&lt;'a, T&gt;&gt;

【问题讨论】:

  • 如果您非常关心复杂性,那么从一开始就拥有两种数据结构并使用集合来获取项目并使用向量来迭代它们可能是合适的。当你添加一个项目时,你对两个结构都这样做,所以添加仍然是摊销 O(log N)

标签: rust reference time-complexity refcell


【解决方案1】:

最简单的方法是引用Ref 而不是Ref

fn get_refs<'a, T>(btree: &'a Ref<BTreeSet<T>>) -> Vec<&'a T> {
    btree.iter().collect()
}

Playground link

这样,Ref 可以比函数的生命周期更长,这意味着您可以返回借用 Ref 的引用,而无需处理临时借用。

请注意,这意味着您可以只使用&amp;'a BTreeSet&lt;T&gt;,甚至不必使用Refs,所以您的original code with references works

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 2012-07-29
    • 2011-02-03
    • 1970-01-01
    相关资源
    最近更新 更多