从rust中BinaryHeap的iterator引出的数据结构问题

本文探讨了Rust标准库中的BinaryHeap数据结构及其iterator特性。作者发现into_iter()后得到的元素并非有序,而drain_sorted()和into_iter_sorted()等方法能确保元素有序。BinaryHeap是一个二叉堆,用于实现优先队列,其插入和删除操作遵循特定的堆属性。插入操作在末尾添加元素并可能进行上浮,删除操作则提取根元素并进行下沉以保持堆属性。有序迭代器的操作会消耗BinaryHeap,因为必须确定下一个根元素以保持顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BianryHeap 是 rust 标准库自带的数据结构,相当于其他语言的 PriorityQueue, 这些不需要我多做介绍。今天在用 BinaryHeap 的时候出现了一个问题,就是 into_iter()之后得到的元素不是有序的。让我一度以为自己前面的数据处理有问题,找了半天没有发现啥异样,后来想到以前用 BinaryHeap 都是 while Some(elem) = heap.pop() {}这种形式,是不是 BinaryHeap 的 iterators 不是有序的呢?然后修改了一下代码,换了一下形式,果然如此。当然这不是结束,如果我大 rust 就只能用这么 low 的形式,那也太辱我最受欢迎语言的名声了。其实 BinaryHeap 自身还有几个 iterator, 其中 drain_sorted()和 into_iter_sorted()这两个是保证有序的,而且它的方法很多都有两个版本,带_sorted 后缀的是保证有序的,不带的是不保证有序的。作为一个用户了解到这里就可以了,但是作为一个有理想有追求的开发者,我们还需要进一步去了解,其实细心的朋友应该不难发现,所有带_sorted()后缀或者说所有保证有序的方法其实都是在消耗 BinaryHeap 的,这倒不是 rust 有意为之,而是受限与 BinaryHeap 这种数据结构的特性。

先说一下 binary heap 的定义:

A binary heap is a heap data structure that takes the form of a binary tree. Binary heaps are a common way of implementing priority queues. The binary heap was introduced by J. W. J. Williams in 1964, as a data structure for heapsort.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值