Datenstrukturen und Algorithmen

Eine Funktion fib(n) für die Fibonacci-Zahlen ist rekursiv definiert als „ist n kleiner oder gleich 1, gib n zurück; andernfalls gib fib(n−1) + fib(n−2) zurück“. Wie oft wird fib beim Aufruf von fib(5) aufgerufen, den ersten Aufruf eingeschlossen?

  1. A6
  2. B9
  3. C15
Antwort und Erläuterung anzeigen

Antwort: C. 15

Sei C(n) die Zahl der Aufrufe für fib(n). Dann gilt C(0) = C(1) = 1 und C(n) = 1 + C(n−1) + C(n−2), also C(2) = 3, C(3) = 5, C(4) = 9 und C(5) = 15. Weil dieselben Werte immer wieder neu berechnet werden, wächst die Zahl exponentiell mit n; fib(30) verursacht etwa 2,69 Millionen Aufrufe. Mit Memoisation (einer Form der dynamischen Programmierung), die berechnete Werte in einer Tabelle speichert, werden nur die sechs Werte fib(0) bis fib(5) berechnet, und die Aufrufe sinken auf 9 (2n − 1). 6 ist die Zahl der verschiedenen Argumente, und 9 die Zahl der Aufrufe mit Memoisation.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Datenstrukturen und Algorithmen

  1. 8 Yen sollen mit Münzen zu 1 Yen, 4 Yen und 6 Yen bezahlt werden. Welche Aussage über die Zahl der Münzen, die ein Greedy-Algorithmus wählt (der zuerst so viele der größten Münze wie möglich verwendet), im Verhältnis zur kleinstmöglichen Münzzahl ist richtig?
  2. Ein Rucksack mit der Kapazität 8 wird mit Gegenständen aus vier Gegenständen mit (Gewicht, Wert) (2, 3), (3, 4), (4, 5) und (5, 6) gefüllt. Jeden Gegenstand gibt es nur einmal, und Gegenstände lassen sich nicht teilen. Wie groß ist der höchste Gesamtwert bei einem Gesamtgewicht von höchstens 8?
  3. Welche Aussage beschreibt ein Merkmal des Boyer-Moore-Algorithmus zum Suchen eines Musters in einer Zeichenkette richtig?
  4. Ein dynamisches Array legt, wenn ein Element hinzugefügt wird, während es voll ist, einen neuen Bereich mit doppelter Kapazität an und kopiert alle Elemente dorthin. Wie viele Elementkopien entstehen insgesamt, wenn einem leeren Array mit der Kapazität 1 nacheinander 1000 Elemente hinzugefügt werden?
  5. Warum ist bei einer Hashtabelle mit vielen Elementen und einem Belegungsfaktor von etwa 0,5 die offene Adressierung mit linearem Sondieren am ehesten schneller als die Verkettung (Verbinden der Elemente durch verkettete Listen)?