我想用浮点数来填充一个二叉堆 - 更具体地说,我想实现一个最小堆。
似乎浮点数不支持 Ord
,因此不能直接使用。 我尝试将它们包装起来,但迄今为止失败了。 然而,如果我能够将它们包装起来,那么我也可以实现 Ord
,以使它有效地使 BinaryHeap
成为最小堆。
这是我尝试过的包装器的示例:
#[derive(PartialEq, PartialOrd)]
struct MinNonNan(f64);
impl Eq for MinNonNan {}
impl Ord for MinNonNan {
fn cmp(&self, other: &MinNonNan) -> Ordering {
let ord = self.partial_cmp(other).unwrap();
match ord {
Ordering::Greater => Ordering::Less,
Ordering::Less => Ordering::Greater,
Ordering::Equal => ord
}
}
}
问题在于 pop
操作返回的值好像是基于最大堆而言的。
我应该怎样用 f64
类型的值将一个二叉堆构建成为最小堆呢?
minheap.push(MinNonNan(42.0))
和if let Some(MinNonNan(root)) = minheap.pop() ...
- maxcountrymanPartialOrd
以与Ord
一致。它们并不真正意味着相互矛盾 - 编译器可能会基于它们实际上是相同的假设进行优化。 - trent