【问题标题】:How to get the maximum and minimum value of an ordered set / ordered map?如何获得有序集/有序图的最大值和最小值?
【发布时间】:2020-03-15 23:24:57
【问题描述】:

Rust 的有序集是 BTreeSet:

use std::collections::BTreeSet;

// Type inference lets us omit an explicit type signature (which
// would be `BTreeSet<&str>` in this example).
let mut books = BTreeSet::new();

// Add some books.
books.insert("A Dance With Dragons");
books.insert("To Kill a Mockingbird");
books.insert("The Odyssey");
books.insert("The Great Gatsby");

有序映射是BTreeMap

既然 set 和 map 是有序的,那么应该有一种方法来获取包含的最大和最小元素。你如何获得它们?

【问题讨论】:

  • 为什么不改用BinaryHeap,它有一个pop() 方法。
  • @hellow 是的,如果您只需要读取值,可能更合适的是peek。但我不确定你是否也能得到另一个极值。就我个人而言,我使用的是BTreeMaps,并且该顺序用于在集合中进行搜索。

标签: rust b-tree ordered-map ordered-set


【解决方案1】:

此类型没有最大或最小成员方法(继承或来自 trait)。

在 O(log(n)) 中访问此信息的最佳方式是直接使用迭代器,正如开发团队在 issue 31690 from GitHub 中提到的那样:

let map: BTreeSet<V> = ...;
let min = map.iter().next();
let max = map.iter().next_back();

您可以使用Iterator::max()Iterator::min() 方法获取集合的最大值和最小值,但对有序集合执行此操作将浏览整个集合,而忽略我们从订单中获得的信息。

// This will be very slow
map.iter().max()
map.iter().min()

Issue 59947 has a benchmark 显示了BTreeMap 的两个备选方案:

test bench_first ... bench:           9 ns/iter (+/- 0)
test bench_last  ... bench:           8 ns/iter (+/- 0)
test bench_max   ... bench:       3,603 ns/iter (+/- 536)
test bench_min   ... bench:       3,755 ns/iter (+/- 328)

【讨论】:

  • Rust 不限于std,crates.io/crates/min-max-heap
  • @Stargateur:当然可以,但是堆不是集合/映射,所以虽然它可能适合 OP 需求,但对于这个问题它不适合。
  • 有趣的是,我刚刚在 TWiR 中遇到了github.com/rust-lang/rust/pull/65637
  • @MatthieuM。谢谢。如果我理解此提交,则有序集将有firstlast,有序映射将有first_key_valuelast_key_value。由于合并还很年轻,我想我们将不得不等待一段时间。 (:
  • 2020年,性能问题可能不再存在! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
  • 2019-06-24
  • 2015-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多