Hallo,
ich will in einer Baumstruktur mit Pointern zu den Nachbarknoten, zum Vaterknoten und ersten Kindknoten einfach rausfinden können welcher Kindknoten wenn man diese vergleicht jetzt in einem levelorder durchlauf vor dem anderen Knoten kommt.
Dazu dachte ich mir kann ich ja anfänglich ganz einfach numerisch durchnummerieren von 0 bis n. Werden dann Subbäume irgendwo eingefügt, bspw. als erstes Kind vom Vaterknoten so kann ich ja einfach erster Kindknoten falls vorhanden -1 machen, falls nicht 0 zuweisen. Wenn ich ganz rechts einen Kindknoten einfügen will (als letztes Kind) einfach die Zahl vom linken Nachbarknoten nehmen + 1. Wenn ich Kindknoten dazwischen einfügen will dann kann ich ja einfach die Ordnungszahl vom linken nachbarn + rechter Nachbar und durch 2 teilen.
Jetzt zu meiner Frage. Prinzipiell würde es doch reichen dazu eine Variable vom Typ double zu verwenden, aber wahrscheinlich hab ich dann schon Rundungsfehler. Wahrscheinlich wäre deshalb BigDecimal am besten geeignet?
Zudem eine dumme Frage, wie kriege ich eine Byte-Array represäntation von einer BigDecimal Instanz um diese zu serialisieren? Ich nehme mal an irgendwie aufteilen in vor-komma und nach-komma Stellen.
BTW: Nochmal zur eigentlichen Idee, ich will damit einfach bestimmen können welcher Kindknoten wenn man diese vergleicht in der Ordnung oder in einem Levelorder Durchlauf vorher kommt. Momentan nutze ich dazu noch:
was natürlich sehr ineffizient ist, weil es sich um eine persistente (also auf Festplatte/Flash-disc gespeicherte) Baumstruktur handelt und somit die Knoten möglicherweise erst in den Hauptspeicher geladen werden müssen. Bei sehr vielen Vergleichen macht das wahrscheinlich einen deutlichen Unterschied, ob ich dann eine relative positionsangabe in den Knoten selbst speichere oder nicht. D.h. der Rückgabewert muss kein int sein. Im Prinzip will ich nur in der Lage sein beim Vergleich dann -1 oder 1 zurückzugeben je nachdem welcher der beiden verglichenen Knoten in der Kindordnung vorher kommt.
Letztendlich habe ich da bisher halt: return p1.getSiblingPosition() - p2.getSiblingPosition();
Viele Grüße,
Johannes
ich will in einer Baumstruktur mit Pointern zu den Nachbarknoten, zum Vaterknoten und ersten Kindknoten einfach rausfinden können welcher Kindknoten wenn man diese vergleicht jetzt in einem levelorder durchlauf vor dem anderen Knoten kommt.
Dazu dachte ich mir kann ich ja anfänglich ganz einfach numerisch durchnummerieren von 0 bis n. Werden dann Subbäume irgendwo eingefügt, bspw. als erstes Kind vom Vaterknoten so kann ich ja einfach erster Kindknoten falls vorhanden -1 machen, falls nicht 0 zuweisen. Wenn ich ganz rechts einen Kindknoten einfügen will (als letztes Kind) einfach die Zahl vom linken Nachbarknoten nehmen + 1. Wenn ich Kindknoten dazwischen einfügen will dann kann ich ja einfach die Ordnungszahl vom linken nachbarn + rechter Nachbar und durch 2 teilen.
Jetzt zu meiner Frage. Prinzipiell würde es doch reichen dazu eine Variable vom Typ double zu verwenden, aber wahrscheinlich hab ich dann schon Rundungsfehler. Wahrscheinlich wäre deshalb BigDecimal am besten geeignet?
Zudem eine dumme Frage, wie kriege ich eine Byte-Array represäntation von einer BigDecimal Instanz um diese zu serialisieren? Ich nehme mal an irgendwie aufteilen in vor-komma und nach-komma Stellen.
BTW: Nochmal zur eigentlichen Idee, ich will damit einfach bestimmen können welcher Kindknoten wenn man diese vergleicht in der Ordnung oder in einem Levelorder Durchlauf vorher kommt. Momentan nutze ich dazu noch:
Java:
public int getSiblingPosition() {
int index = 0;
while (mNodeReadTrx.hasLeftSibling()) {
mNodeReadTrx.moveToLeftSibling();
index++;
}
return index;
}
was natürlich sehr ineffizient ist, weil es sich um eine persistente (also auf Festplatte/Flash-disc gespeicherte) Baumstruktur handelt und somit die Knoten möglicherweise erst in den Hauptspeicher geladen werden müssen. Bei sehr vielen Vergleichen macht das wahrscheinlich einen deutlichen Unterschied, ob ich dann eine relative positionsangabe in den Knoten selbst speichere oder nicht. D.h. der Rückgabewert muss kein int sein. Im Prinzip will ich nur in der Lage sein beim Vergleich dann -1 oder 1 zurückzugeben je nachdem welcher der beiden verglichenen Knoten in der Kindordnung vorher kommt.
Letztendlich habe ich da bisher halt: return p1.getSiblingPosition() - p2.getSiblingPosition();
Viele Grüße,
Johannes