如何使用Rust'实现f64的最小堆;什么是二进制堆?

如何使用Rust'实现f64的最小堆;什么是二进制堆?,rust,min-heap,Rust,Min Heap,我想用浮点数填充二进制堆——更具体地说,我想实现一个最小堆 浮点数似乎不支持Ord,因此无法开箱即用。到目前为止,我试图包装它们的尝试都失败了。然而,如果我可以包装它们,那么我也可以实现Ord,这样就可以有效地使BinaryHeap成为最小堆 下面是我尝试的包装器示例: #[derive(PartialEq, PartialOrd)] struct MinNonNan(f64); impl Eq for MinNonNan {} impl Ord for MinNonNan { fn

我想用浮点数填充二进制堆——更具体地说,我想实现一个最小堆

浮点数似乎不支持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 < /代码>值为min堆?< /p> ,而不是编写自己的<代码> MinNonNan <代码>,考虑使用板条箱+类型。

工作示例
使用std::cmp::排序;
使用std::collections::BinaryHeap;
#[衍生(部分)]
结构MinFloat(f64);
MinFloat{}的impl Eq
MinFloat的impl PartialOrd{
fn部分\u cmp(&self,其他:&self)->选项{
其他.0.partial_cmp(&self.0)
}
}
请求最小浮点数{
fn cmp(&self,其他:&MinFloat)->订购{
self.partial_cmp(其他).unwrap()
}
}
fn main(){
让mut minheap=BinaryHeap::new();
push(MinFloat(2.0));
push(MinFloat(1.0));
push(MinFloat(42.0));
如果让Some(MinFloat(root))=minheap.pop(){
println!(“{:?}”,根);
}
}

请说明如何从二进制堆插入和弹出。@kennytm
minheap.push(MinNonNan(42.0))
如果让一些(MinNonNan(root))=minheap.pop()…
凭直觉,我会尝试实现
PartialOrd
以同意
Ord
。它们并不意味着相互矛盾——编译器可能会在假设它们实际上是相同的基础上进行优化。值得指出的是,这是针对一个小脚本的,如果可以避免的话,我不想使用外部libs。不过,谢谢你指出那些板条箱@maxcountryman Rust是为了方便地使用extern板条箱而设计的,就像javascript中的例子一样。是因为我,还是这个解决方案在比较过程中忽略了小数点?@Klesun
type MinNonNan = Reverse<NotNan<f64>>;
#[derive(PartialEq)]
struct MinNonNan(f64);

impl PartialOrd for MinNonNan {
    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
        other.0.partial_cmp(&self.0)
    }
}

impl Ord for MinNonNan {
    fn cmp(&self, other: &MinNonNan) -> Ordering {
        self.partial_cmp(other).unwrap()
    }
}
use std::cmp::Ordering;
use std::collections::BinaryHeap;

#[derive(PartialEq)]
struct MinFloat(f64);

impl Eq for MinFloat {}

impl PartialOrd for MinFloat {
    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
        other.0.partial_cmp(&self.0)
    }
}

impl Ord for MinFloat {
    fn cmp(&self, other: &MinFloat) -> Ordering {
        self.partial_cmp(other).unwrap()
    }
}

fn main() {
    let mut minheap = BinaryHeap::new();
    minheap.push(MinFloat(2.0));
    minheap.push(MinFloat(1.0));
    minheap.push(MinFloat(42.0));
    if let Some(MinFloat(root)) = minheap.pop() {
        println!("{:?}", root);
    }
}