Я хочу заполнить двоичную кучу числами с плавающей запятой - точнее, я хотел бы реализовать минимальную кучу.
Похоже, что числа с плавающей запятой не поддерживают 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
возвращает значения, как если бы это была максимальная куча.
Что именно мне нужно сделать, чтобы заполнить BinaryHeap
значениями f64
в виде минимальной кучи?
minheap.push(MinNonNan(42.0))
иif let Some(MinNonNan(root)) = minheap.pop() ...
- person maxcountryman   schedule 10.10.2016PartialOrd
, чтобы согласиться сOrd
. На самом деле они не предназначены для того, чтобы противоречить друг другу - компилятор может выполнять оптимизацию, исходя из предположения, что они фактически одинаковы. - person trentcl   schedule 10.10.2016