1个不稳定版本

0.1.0 2022年5月14日

#1412 in 数据结构

MIT 协议

72KB
1.5K SLoC

二叉堆

描述

使用二叉堆实现的高级队列。

Beap(二叉堆)是一个隐式数据结构,它允许高效地插入和搜索元素,开销低(O(1))。

插入和弹出最大元素的时间复杂度为O(sqrt(2n))。检查最大元素是O(1)。将向量转换为beap可以通过排序完成,具有O(nlog(n))时间复杂度。尽管与经典二叉堆相比,插入和弹出操作较慢,但二叉堆有一个重要的优点:搜索和删除任意元素以及找到最小元素,其渐进复杂度为O(sqrt(2n)),而二叉堆为O(n)。

本包提供了一个二叉堆的实现——Beap,它与来自 std::collectionsBinaryHeap 具有相同的接口,同时它还具有几个新功能。

了解二叉堆

用法

作为库

use beap::Beap;

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

// We can use peek to look at the next item in the beap. In this case,
// there's no items in there yet so we get None.
assert_eq!(beap.peek(), None);

// Let's add some scores...
beap.push(1);
beap.push(5);
beap.push(2);

// Now peek shows the most important item in the beap.
assert_eq!(beap.peek(), Some(&5));

// We can check the length of a beap.
assert_eq!(beap.len(), 3);

// We can iterate over the items in the beap, although they are returned in
// a random order.
for x in beap.iter() {
    println!("{}", x);
}

// If we instead pop these scores, they should come back in order.
assert_eq!(beap.pop(), Some(5));
assert_eq!(beap.pop(), Some(2));
assert_eq!(beap.pop(), Some(1));
assert_eq!(beap.pop(), None);

// We can clear the beap of any remaining items.
beap.clear();

// The beap should now be empty.
assert!(beap.is_empty())

已知项目列表的 Beap 可以从数组初始化

use beap::Beap;
let beap = Beap::from([1, 5, 2]);

最小堆

可以使用 core::cmp::Reverse 或自定义 Ord 实现将 Beap 转换为最小堆。这使得 beap.pop() 返回最小值而不是最大值。

use beap::Beap;
use std::cmp::Reverse;

let mut beap = Beap::new();

// Wrap values in `Reverse`
beap.push(Reverse(1));
beap.push(Reverse(5));
beap.push(Reverse(2));

// If we pop these scores now, they should come back in the reverse order.
assert_eq!(beap.pop(), Some(Reverse(1)));
assert_eq!(beap.pop(), Some(Reverse(2)));
assert_eq!(beap.pop(), Some(Reverse(5)));
assert_eq!(beap.pop(), None);

排序

use beap::Beap;

let beap = Beap::from([5, 3, 1, 7]);
assert_eq!(beap.into_sorted_vec(), vec![1, 3, 5, 7]);

如果您有任何评论或建议,或者您突然发现了一个错误,请发起一个新问题或请求。

无运行时依赖项