如何在 BTreeMap/BTreeSet 中找到下一个较小的键?

Posted

技术标签:

【中文标题】如何在 BTreeMap/BTreeSet 中找到下一个较小的键?【英文标题】:How to find next smaller key in BTreeMap/BTreeSet? 【发布时间】:2018-09-10 23:52:36 【问题描述】:

如果我正确理解 b 树,那么在对数时间内搜索密钥应该很容易且可能。如果key不存在,可以返回下一个越来越大的key;给定键的邻居(如果它会被插入)。

此功能是否已经存在?

使用当前 API 的一种可能但复杂的方法是插入密钥,然后获取该密钥的迭代器,以便我们可以在此迭代器上调用 next。虽然,它也不清楚如何获得一个新插入元素的迭代器(参见this question)

为什么缺少这些方法或者我缺少什么?

【问题讨论】:

您问题的后半部分已经存在:How to insert a value into a BTreeSet in Rust and then get an iterator beginning at its location?。请edit您的问题将其删除,因为问题应集中在一个特定主题上。 感谢您的帮助,我将问题编辑为仅关注查找下一个越来越大元素的扩展 api(最好不插入) 【参考方案1】:

您可以在返回的Range 对象上使用range method 和迭代器方法:

use std::collections::BTreeMap;
let mut map = BTreeMap::new();
map.insert(2, 0);
map.insert(3, 1);
map.insert(5, 2);
map.insert(7, 3);
map.insert(11, 4);
let key = 6;
println!("maximum in map less than : :?",
         key, map.range(..key).next_back().unwrap());
println!("minimum in map greater than : :?",
         key, map.range(key..).next().unwrap());

next_back()next() 都执行树遍历,因此它们的效率相当高。

【讨论】:

map.range(..key).rev().next().unwrap()map.range(..key).next_back().unwrap() 为什么不呢?如果这样做效率不高,您是否认为 Rust 标准库会在类型上实现 DoubleEndedIterator 嗯,它缺乏last() 的有效实现,所以我很担心。但代码看起来没问题。 在这种情况下,您可以提交一个 PR,将 Iterator::last 的专业化添加到 RangeRangeMut 迭代器。 是的,这些函数使用树形结构,应该相当高效。

以上是关于如何在 BTreeMap/BTreeSet 中找到下一个较小的键?的主要内容,如果未能解决你的问题,请参考以下文章

如何从单词列表中找到它在字符串中找到的单词[重复]

如何在猫鼬中找到随机记录[重复]

如何在 Java 的目录中找到最后修改的文件?

如何在文本中找到搭配,python

如何在片段列表中找到特定片段?

给定模型对象,如何在 NSTreeController 中找到索引路径?