Hallo Felix,
Denn für das 1-kleinste Element muss man den längsten Pfad im
Heap folgen und das ist nicht .
Nicht unbedingt. Zwar wird in den meisten Algorithmenbüchern ein Heap so dargestellt, dass die Wurzel das grösste Element ist und alle Nachfolger eines Knoten kleiner sein müssen als der Knoten. Allerdings könnte der Heap auch genau anders herum organisiert werden, d.h. kleinste Zahl an der Wurzel, alle Nachfolger größer als ein Knoten. Dann muss nur noch das „Sinken“ von Knoten angepasst werden. Heapsort würde dann eine aufsteigend sortierte Zahlenfolge ausgeben.
Allerdings glaube ich, dass die Aussage i-kleinstes Element in O(log i) Schritten trotzdem mit nein zu beantworten ist.
Für das n-kleinste Element hiesse das ja O(log n). An einem Knoten habe ich nur die Information, dass alle Nachfolger kleiner sind. Jedoch weiss ich nicht, in welchem meiner Teilbäume das Minimum liegt. Für das Ablaufen eines beliebigen Pfades bis zur Wurzel benötige ich jedoch bereits log n Schritte (das ist ja gerade die Länge dieses Pfades bei einem Binärbaum).
Auch wenn mein Heap als Array organisiert ist, kann ich das n-kleinste Element nicht schnell finden. Das n-kleinste ist per Definition ein Blatt (es kann keine Nachfolger haben). Ein Heap mit n Knoten hat ~n/2~ Blätter, das heisst das n-kleinste ist nur in O(n) Schritten zu finden (~ bedeute das kleinste ganze grösser gleich).
Oder kennt jemand noch einen anderen Algorithmus zum finden des n-kleinsten Elementes, der eine hier nicht genannte Eigenschaft des Heaps ausnutzt ?
a+
Hartmut