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.