Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

Aufgabe:

In einem Heap mit n Datensätzen werde der Schlüssel eines beliebigen Datensatzes geändert.

Formulieren Sie einen Algorithmus mit Aufwand O(log(n)), der die Heapstruktur wieder herstellt. (Sie müssen also auch eine Aufwandsanalyse durchführen!)

Lösung:



[U]Algorithmus[/U]: Heap bearbeiten

[U]Eingabe[/U]: Zu bearbeitende Heap h, Schlüssel s des zu bearbeitenden Knotens,  neuer Schlüssel t

[U]Ausgabe[/U]: Heap h

Suche Knoten n mit Schlüssel s;

Wenn Knoten n mit Schlüssel s gefunden:

Ersetze s durch t

Sonst:

	Gebe aus „Zu bearbeitender Schlüssel nicht gefunden“;

	Beende den Algorithmus;

Solange t kleiner als Schlüssel eines Sohnes von n

	Bestimme den größeren Schlüssel g der beiden Söhne von n;

	Vertausche n mit dem Sohn mit g (sift down);	

Solange t größer ist als Schlüssel des Vaters

	Vertausche t mir seinem Vater (sift up);

Meine erste Frage wäre, ob der Algorithmus so korrekt ist, oder ob ich etwas vergessen habe zu ebachten?

Meine zweite Frage wäre, wie ich die Aufwandsanalyse durchzuführen habe. Darin bin ich leider nicht so fit.

O(log(n)) im Worstcase ist meiner Meinung nach gegeben, da ich maximal h (Höhe) Schritte durchführen kann, indem ich entweder die kleinste Zahl ganz oben einfüge, oder die größte Zahl ganz unten. Die Höhe ist ja gleich log(n). Aber wie schreibe ich das nun mathematisch korrekt auf?

Den Algorithmus einmal als Pseudocode aufschreiben und jede Aktion entsprechend beschreiben

Bsp Bubblesort


for i = 1 to n do             => Aufwand ~n

     for j = 1 to n do        => Aufwand ~n

          if a[i] < a[j]         => Aufwand ~1

              h = a[i]           => "

              a[i] = a[j]        => "

              a[j] = h           => "

         fi

    endfor

endfor

Induktionsanfang n=1 ist erfüllt

Induktionsschnritt für n => n+1

für n*n+4 => (n*n+c) + (1+1+4) = ((n+1)*(n+1) + c) lösen und und letztendlich kommt auf beiden seiten n^2 + c raus und somit passt das auch

für n*n+4 => (n*n+c) + (1+1+4) = ((n+1)*(n+1) + c) lösen und und letztendlich kommt auf beiden seiten n^2 + c raus und somit passt das auch

Das stimmt so nicht,

ich habe für n nach n+1

n*(n+c) + 1+1+c = (n+1)*((n+1)+c)

kommt aber das gleiche bei raus. Ich sortiere n Elemente und dann noch ein weiteres Gegenübergestellt ich sortiere (n+1) Elemente. 1+1+c wäre letztendlich der Aufwand um 1 Element zu sortieren. Beim Umstellen kommt dann links O(n^2) + O(cn) raus da, der lineare Anteil fällt logischerweise weg da O(cn) < O(cn^2) und rechts geht das ganze analog

Ok, der Aufbau ist nachvollziehbar. Aber wie kommst du darauf dass der Induktionsschluss gleich ist.


n*(n + c) + 1 + 1 + c = (n + 1)*((n + 1) + c) 

n² + n*c + 2 + c = (n + 1) * (n + 1 + c)

n² + n*c + 2 + c = n² + n + n*c + n + 1 + c

n² + n*c + 2 + c = n² + n*c + 2n + 1 + c

Ok, der Aufbau ist nachvollziehbar. Aber wie kommst du darauf dass der Induktionsschluss gleich ist.

Weil ich das abschätzen kann. 1+c < c => irgendein konstanter Faktor und O(cn) kann ich garantiert durch O(cn^2) abschätzen, denn O(cn) < O(cn^2).

D.h. im Induktionsschluss ist für lim n->inf wirkt das n^2 am "stärksten".

Landau-Symbole sind Schrankenabschätzungen im Limes.

Natürlich muss man noch einmal überlegen, wie man das konkret beweist, ich habe das jetzt "nur" mal auf die Schnelle gemacht, so dass man sieht wie das Prinzip ist

Bearbeitet von flashpixx

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.