Groß-Oh-Notation

Neue Frage »

Fealy Auf diesen Beitrag antworten »
Groß-Oh-Notation
Hi.

Ich hoffe das passt am besten hierhin.

Und zwar habe ich so meine Schwierigkeiten mit der Groß-Oh-Notation.

Wir haben diese in der Vorlesung wie folgt definiert:

g(n) <= c*f(n)

Jetzt haben wir auf einem Übungsblatt eine Tabelle gegeben, und sollen ankreuzen, in welchen Mengen die Funktionen jeweils liegen (ohne Begründung).

Bei einer Funktion jedoch, verstehe ich die Lösung nicht. Generell habe ich mir gemerkt, dass ein Polynom k-ten Grades die asymptotische Laufzeit O(n^k) besitzt.

Die Funktion lautet:



Laut Lösung liegt Funktion in O(n²,2^n,5^n)

Wenn ich allerdings folgendes Anwende:


| teilen durch n²

Ergibt:



Also ist die Bedingung für n² doch garnicht erfüllt? Was übersehe ich?

Generell: Wenn ich einen Bruch habe (wie diesen hier), wie kann ich ganz generell darauf schließen, in welcher Menge die Funktion liegt?

Anscheinend kann man dieses "Rezept" für Brüche nämlich nicht anwenden?

Ich freue mich auf Eure Antworten

Lg,
Fealy
weisbrot Auf diesen Beitrag antworten »
RE: Groß-Oh-Notation
ich verstehe leider nicht ganz wo du das problem siehst.. 1/log(n+5) ist doch nullfolge, und liegt somit in O(1) - das ist genau worauf du durch das kürzen geschlossen hast. lg
Fealy Auf diesen Beitrag antworten »

Heisst also, dass die Bedingung

g(n) <= c *f(n) erfüllt ist, da mit steigendem N 1/log(n+5) gegen Null geht, und c was weiß ich für ne Konstante sein kann?

In meiner Lösung stehen die folgenden Mengen zum Ankreuzen:

0(1), O(log*n), O(n), O(n*log*n), O(n²), O(2^n), O(5^n).

Für die Funktion ist in der Musterlösung aber nur die letzten 3 angekreuzt (Von rechts nach links).

Wie genau schliesst du auf O(1)? Ich habe doch lediglich die Überprüfung für O(n²) gemacht?

Ansonsten bleibt mir immernoch die Frage offen: Wie schließe ich (vor allem bei Brüchen) nur aus reinem Überlegen auf die zutreffenden Mengen für eine gegebene Funktion?

Lg,
Fealy
Airblader Auf diesen Beitrag antworten »
RE: Groß-Oh-Notation
Zitat:
Original von Fealy
Wir haben diese in der Vorlesung wie folgt definiert:

g(n) <= c*f(n)


Entweder, du gibst uns hier eure Definition gnadenlos falsch wieder oder eure Vorlesung ist unbrauchbar -- ich tippe aus Erfahrung auf Ersteres. Aber das ist weder die korrekte, noch irgendeine Definition.

Aus den Beiträgen kann man schließen, dass dir jegliches Verständnis bezüglich der Landau-Symbolik fehlt. Und genau darum ist das Bearbeiten von Aufgaben im Moment aus meiner Sicht zwecklos. Du solltest dir zunächst nochmal die (korrekte!) Definition ansehen und vor allem verstehen, bevor du Aufgaben löst.

Beispiele helfen beim Verständnis -- aber nur solche mit Lösungsweg. Ich rate jetzt einfach mal, dass du Informatik studierst bzw. das eine Informatikvorlesung ist. In diesem Fall findest du im Internet genügend solcher Beispiele (Stichwort asymptotische Laufzeit).

Edit: weisbrots Antwort ist übrigens lediglich missverständlich. 1/log(n+5) ist zwar in O(1), aber n²/log(n+5) nicht.

air
Airblader Auf diesen Beitrag antworten »

Um noch kurz zu verdeutlichen, was weisbrot wohl gemeint hatte:

sollte klar sein. Weiß man zudem , dann folgt mit den "Rechenregeln" auch .
Die anderen beiden Aussagen folgen damit mehr oder weniger direkt auch -- aber wie gesagt, zunächst mal solltest du verstehen, was die Notation überhaupt bedeutet. Alles eben Gesagte setzt natürlich voraus, dass ihr solche Rechenregeln schon kennt. Andernfalls muss man eben elementar über die Definition argumentieren (auch nicht viel schwieriger).

Noch eine Kleinigkeit: Es heißt nicht -- was sollte das denn auch sein? Der Logarithmus ist eine Funktion, also , das Argument ohne Klammern zu schreiben ist lediglich eine Konvention, um etwas faul sein zu dürfen. Der Malpunkt ist jedoch schlicht falsch.

air
Fealy Auf diesen Beitrag antworten »

Hey:

Hier die genaue Definition der Groß-Oh-Notation

O(f) = {g | &#8707; c1,c2 > 0 &#8707; n0 &#8712; N : &#8704;n &#8805; n0 : g(n) &#8804; c1 * f(n) + c2}

(Das ist doch im Grunde genau das, was ich geschrieben habe, oder?). Bin kein Informatikstudent, sondern habe das Fach nur als 20%iges Nebenfach. Daher sind auch meine mathematischen Kenntnisse dementsprechend sehr beschränkt.

Wenn also g Element O(f) ist, so wächst g also asymptotisch (für große N?) nicht schneller als f (deswegen doch auch das <= ?).

Bin mir schon sicher, dass das so zu verstehen ist?

Ich muss doch einfach ein c finden, für welches die Bedingung erfüllt wird. Ist dies gegeben dann liegt eine funktion g(n) in f(n) - oder?

Wenn ihr mir Anhaltspunkte geben würdet, wo mein Verständnisfehler liegt, werde ich gerne Versuchen diesen auszumerzen. Drehe mich hier alleiner aber leider auf der Stelle.

Wir haben genau 2 Aufgaben dazu gemacht.

Bei der einen hat man 5 Funktionen gegeben und soll (ohne Begründung) ankreuzen in welchem Mengen (vgl.) oben diese liegen.

Hier habe ich wie gesagt Probleme, wenns um Brüche geht?

Bei der 2 Aufgabe haben wir bspw. gegeben:

Zeigen oder widerlegen Sie:

2n = O(n)

Ich gehe also einfach hin (so haben wirs in der Übung gemacht):

2n <= c * n | Ich teile durch n

2 <= c | Für c = 2 bspw. erfüllt. => Wahre Aussage.

Wo ist Anzusetzen?

Lg,
 
 
Airblader Auf diesen Beitrag antworten »

Zitat:
Original von Fealy
Hier die genaue Definition der Groß-Oh-Notation

O(f) = {g | &#8707; c1,c2 > 0 &#8707; n0 &#8712; N : &#8704;n &#8805; n0 : g(n) &#8804; c1 * f(n) + c2}


Es gibt den Vorschau-Button aus gutem Grund -- dann passieren solche Copy&Paste-Fehler nicht. Glücklicherweise ist mir die Definition auch so geläufig, du brauchst sie nicht zu wiederholen. Mir liegt aber daran, dass du verstehst, dass

Zitat:
(Das ist doch im Grunde genau das, was ich geschrieben habe, oder?)


eben nicht der Fall ist. Was du geschrieben hast war ein aus dem Zusammenhang gerissener Formelfetzen. Mit der Definition hat dies nichts zu tun, und wer Landausymbole vorher nicht schon kennt, der hätte mit deiner "Definition" im ersten Beitrag nichts anfangen können. Augenzwinkern

Zitat:
Bin kein Informatikstudent, sondern habe das Fach nur als 20%iges Nebenfach. Daher sind auch meine mathematischen Kenntnisse dementsprechend sehr beschränkt.


Was studierst du denn?

Zitat:
Wenn also g Element O(f) ist, so wächst g also asymptotisch (für große N?) nicht schneller als f (deswegen doch auch das <= ?).


Richtig, sozusagen. Etwas genauer bedeutet es eben, dass g bis auf eine Konstante durch f beschränkt ist.

Zitat:
Ich muss doch einfach ein c finden, für welches die Bedingung erfüllt wird. Ist dies gegeben dann liegt eine funktion g(n) in f(n) - oder?


Korrekt. Wichtig ist, dass du ein c findest, so dass die Bedingung für alle n erfüllt ist.

Zitat:
Zeigen oder widerlegen Sie: 2n = O(n)

Ich gehe also einfach hin (so haben wirs in der Übung gemacht):
2n <= c * n | Ich teile durch n
2 <= c | Für c = 2 bspw. erfüllt. => Wahre Aussage.


Korrekt. Und das selbe machen wir nun für deine Funktion. Du hattest ja bereits zu



umgeformt. Jetzt sehen wir, dass die Folge links eine monoton fallende Folge ist. Monoton fallende Folgen sind durch ihr erstes Folgenglied beschränkt, es gilt also . Wählen wir eben jene Zahl als unser c, so ist die obige Ungleichung also erfüllt -- und damit .

air
Fealy Auf diesen Beitrag antworten »

Okay gut. Dann war mein Verständnis ja gar nicht soooooo verkehrt. Ich studiere BWL mit Informatik (20%) an einer TU. Bin in den Info-Sachen eigentlich recht gut, wobei ich quantitativ eher schlecht aufgestellt bin (Lücken über Lücken).

Damit ihr vielleicht eher eine Ahnung habt, wie die eine Aufgabe aussieht, habe ich diese mal abfotografiert:

https://dl.dropbox.com/u/12234165/DSC00114.jpg

So eine Aufgabe wird wohl (aller Voraussicht nach) auch in der anstehenden Klausur drankommen.

Wenn ich dies also explizit ohne Begründung machen soll. Dann ist es für mich immernoch ein Problem, wenn ich Brüche habe. Ich muss doch dann irgendwie darauf schließen können, worin f3 liegt (Ich hab dann ja pro Funktion wohl nur 1 Minute Zeit)

Wenn ich den Test für O(1) mache (und jetzt bitte steinigt mich nicht, wenn ich jetzt hier Bullshit verzapfe), komme ich allerdings auf folgendes.


<=>



Ich kann daraus doch schließen, dass der Linke Term nach Unendlich strebt, da n² Stärker wächst wie log(n+5). Wenn ich das jetzt richtig verstanden habe, muss ich doch daraus schließen, dass kein c zu finden ist, so dass die Bedingung für alle n erfüllt ist.

Lg,
Fealy
Airblader Auf diesen Beitrag antworten »

Bis auf eine sprachliche Ungenauigkeit (2*n wächst auch stärker als n, der Quotient divergiert dennoch nicht) ist das korrekt und es gilt in der Tat .

Ob die Funktion ein Bruch ist oder nicht spielt erstmal keine Rolle -- es bleibt ja die selbe Aufgabenstellung und Definition. Wenn es darum geht, das Ganze nun "schnell" zu sehen: Übung!

Wer geübt ist, sieht sofort, dass der Nenner das n² nur kleiner macht. Etwas mehr in Formeln ausgedrückt:

Damit ist sofort klar, dass die Funktion in liegt, also in einer polynomialen Klasse. Damit liegt sie aber auch direkt in den exponentiellen Klassen und (*).
Jetzt muss man noch verstehen, warum sie nicht in den anderen Klassen liegt. Dass die Folge divergiert lässt sich zum Beispiel direkt sehen (hast du ja auch). Damit ist schonmal raus. Bei den übrigen Klassen würden wir beim "Rüberteilen-Schritt" zwar bis zu ein 'n' bekommen, das wir kürzen könnten, aber selbst die dazukommenden Logarithmen im Nenner gleichen nicht das Wachstum des verbleibenden linearen Zählerterms aus (den Satz bitte mehrfach lesen und nebenbei mit diesen Klassen mal durchrechnen, dann verstehst du, was ich meine).

Wie gesagt: So kann man sowas ganz schnell sehen. Aber das erfordert eben ein wenig Übung.

(*) Ein Faktum, das du dir am Besten gleich jetzt mal klar machst, indem du z.B. beweist, dass gilt. Dazu genügt es, dass du zeigst (wobei du verstehen solltest, wieso das ausreicht).

air
P.S.: Bilder bitte nicht auf externen Plattformen hochladen, sondern direkt hier im Board (beim Schreiben des Beitrages findest du direkt unter dem Textfeld einen Button "Dateianhänge").
Fealy Auf diesen Beitrag antworten »

Hey,

vorab möchte ich mich nochmal für deine Mühe und Hilfe bedanken.

Wenn eine Funktion A asymptotisch nicht schneller wächst als eine Funktion B, Dann ist mir durchaus klar, dass A nicht schneller wachsen kann als C wenn gilt, dass: C asymptotisch schneller wächst als B.

Zu deiner Aufgabe:

| ln ()

| c=2



Somit ist die Bedingung erfüllt.

Lg,
Fealy
Airblader Auf diesen Beitrag antworten »

Du hast das Logarithmengesetz falsch angewendet. Da müsste stehen



mit , aus der multiplikativen wurde also eine additive Konstante. Wieso das jetzt unmittelbar gelten soll sehe ich nicht.

Typischerweise macht man es ein wenig anders. Wir wollen ja



zeigen. Nun gilt für und , für ist obige Ungleichung also erfüllt, da die Ungleichung für erfüllt ist und die rechte Seite stets schneller wächst.
Den Fall können wir getrost ignorieren -- das sind nämlich nur endlich viele Zahlen, die wir durch entsprechende Wahl der Konstanten mühelos unter Kontrolle bekommen.

Bei deiner Aufgabe sind alle Klassen übrigens von links nach rechts geordnet, d. h. wenn in einer Spalte ein Kreuz gesetzt werden muss, dann auch in allen Spalten rechts davon. Andersrum, wird in einer Spalte kein Kreuz gesetzt, dann auch in keiner Spalte links davon. Das ist natürlich nicht bei jeder Aufgabe so.
Im Grunde haben wir das ja eben gezeigt, um eben zu nutzen: Liegt es in O(n^2), dann auch in O(2^n) und O(5^n). Analog, da es nicht in O(n*log n) liegt, liegt es z. B. auch nicht in O(1). Ist man sich über diese Inklusionen der Klassen bewusst, muss man gar nicht alle Fälle einzeln durchgehen.

air
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »