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.
A binary heap is defined as a binary tree with two additional constraints:
-
Shape property: a binary heap is a co

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





