Wie kann ich einen Min-Heap von f64 mit Rust's BinaryHeap implementieren?

8

Ich möchte einen binären Heap mit Floats füllen - genauer gesagt möchte ich einen Min-Heap implementieren.

Es scheint, dass Floats Ord nicht unterstützen und daher nicht sofort einsatzbereit sind. Meine Versuche, sie zu verpacken, sind bisher gescheitert. Es scheint jedoch, dass ich, wenn ich sie umschließen könnte, auch Ord so implementieren könnte, dass es effektiv BinaryHeap zu einem Min-Heap macht.

Hier ist ein Beispiel für einen Wrapper, den ich ausprobiert habe:

%Vor%

Das Problem ist pop returns gibt die Werte zurück, als wäre es ein Max-Heap.

Was genau muss ich tun, um BinaryHeap mit f64 -Werten als Min-Heap zu füllen?

    
maxcountryman 10.10.2016, 00:38
quelle

2 Antworten

6

Anstatt Ihre eigene MinNonNan zu schreiben, sollten Sie die Ordered-Float + Kisten revordieren .

Da Sie #[derive] ing PartialOrd sind, vergleichen die Methoden .gt() , .lt() usw. immer noch normal, d. h. MinNonNan(42.0) < MinNonNan(47.0) ist immer noch wahr. Die Ord -Begrenzung beschränkt Sie nur auf streng geordnete Typen. Dies bedeutet nicht, dass die Implementierung .cmp() anstelle von < / > / <= / >= verwendet, auch nicht der Compiler ändere diese Operatoren plötzlich, um die Ord Implementierung zu verwenden.

Wenn Sie die Reihenfolge umkehren möchten, müssen Sie auch PartialOrd neu implementieren.

%Vor%     
kennytm 10.10.2016, 01:16
quelle
2

Arbeitsbeispiel

Ich wollte ein grundlegendes Arbeitsbeispiel verfolgen, das auf der akzeptierten Antwort für zukünftige Menschen basiert, die auf dieses Problem stoßen:

%Vor%     
Shepmaster 11.10.2016 20:14
quelle

Tags und Links