0

Hi zusammen,

kann vllt jemand über meine Aufgabe schauen und mir sagen, ob ich das bis dahin richtig gelöst habe?

Danke :)

hier die Aufgaben:

Aufgabe 1 a) Entwerfen Sie einen Algorithmus im Pseudocode zur Bestimmung des arithmetischen Mittelwerts x aller Elemente in einem Array A:

Eingabe: A = (a1, …, an) mit ai ∈ ℝ , i, n ∈ ℕ, 1 ≤ i ≤ n Ausgabe: 𝑥=(Σ𝑎𝑖)/𝑛𝑛𝑖=1, x ∈ ℝ

b) Welche Anweisung halten Sie für die grundlegende Anweisung (Begründung)? Bestimmen Sie die Zeitkomplexität!

meine Lösung: a) Algorithmus für den Mittelwert x aus einer Folge von Zahlen bestimmten

Eingabe: {a1,a2,..an.} .... etc Ausgabe: x

for each a E Eingabe

      Σ= Σ+ a

Output = Σ/ n

hier bin ich nicht sicher, ob ich n mitzählen muss in der Schleife, oder ob man davon ausgeht, dass das Programm die Element automatisch mitzählen kann, wie man es von Java kennt für array lenght. Hoffe ihr wisst, was ich mein :)

b) Die grundlegende Anweisung ist hier die (for-each) Schleife. Die Komplexität: O(n) stimmt das? meine Kommilitonen und ich hatten eben diskutiert, dass es doch auch O(1) sein kann, ich glaub eher nicht

Aufgabe 2 Die Zeitkomplexität eines Algorithmus lasse sich nach der folgenden Rekursionsgleichung bestimmen:

𝑇(𝑛)= { 1, 𝑓𝑎𝑙𝑙𝑠 𝑛=0

          𝑇(𝑛−1)+𝑛,    𝑓𝑎𝑙𝑙𝑠 𝑛≥1

Lösen Sie die Rekursionsgleichung mit Hilfe von Satz 3.1 und bestimmen Sie die Komplexitätsklasse Θ(n).

Satz 3.1Satz 3.1

  1. Lösung für Aufgabe 2

hier bin ich ganz unsicher, hab mich nur orientiert an einem Beispiel aus unserem Skript. weiß aber nicht wirklich was ich gemacht hab :)

btw. könnt ihr hierzu leichte literatur empfehlen, damit ich mir das thema noch etwas besser aneignen kann? danke!

Bearbeitung: enter image description here

Diese Frage melden
gefragt

Student, Punkte: 56

 
Kommentar schreiben
1 Antwort
1

Ich würde keine foreach loop verwenden, ist zwar prinzipiell Pseudocode, Du mußt aber erklären, wo Du das n her nimmst (die Komplexität das zu ermitteln könnte ja theoretisch ziemlich groß sein, theoretisch sogar bestimmend für die Komplexität, daher am Besten angeben), mach ne for 1..n loop und gut

O(1) kann nicht sein, wie willst Du eine Summe über n Elemente in einem Schritt (bzw. einer konstanten Anzahl von Schritten) machen? Das muß mindestens O(n) sein, in Deinem Fall wohl O(2n) weil Du ja die n ermitteln mußt, somit ist das O(n) sein.

Bei Aufgabe 2 ist Dir am Ende ein kleiner Fehler passiert (wobei ich den Exponenten vom 2ten n nicht lesen kann). Laß uns das mal ohne die Formel (die wird wohl stimmen, habs nicht nachgeprüft) analysieren. Du hast T(0) = 1 und T(n)=T(n-1)+n, also T(1)=T(0)+n=1+n, T(2)=T(1)+n=1+n+n, ... Man sieht schnell wie der Hase läuft, da kommt wohl für T(n) = 1+ n + .... + n womit das n eben n mal vorkommt. Somit muß (T(n) =1 + n^2) sein, was (O(n^2)) entspricht.

Laß uns mal die letzten 3 Zeilen Deiner Rechnung betrachten: (= \sum\limits_{d=0}^{n} 1^{d} f(n-d)) (= \sum\limits_{d=0}^{n} n-d) (= n + (n-1) + (n-2) + ... + (n-(n-1)) + (n-n) # n-n=0 lassen wir weg damit haben wir genau n Summanden!) (= n + n + ... + n - 1 - 2 - 3 - ... - (n-1)) (= n^2 - \frac{(n-1)(n-2)}{2}) (\frac{(n-1)(n-2)}{2} < \frac{n^2}{2}) (= n^2 - \frac{n^2}{2}) (= \frac{n^2}{2}) und das ist ja ganz sicher auch (O(n^2)) Damit dürfte die Komplexität von Aufgabe 2 O(n^2) und nicht O(n) sein.

Diese Antwort melden
geantwortet

Punkte: 45

 

hi
danke für die erklärung und den tipp mit der "normalen" schleife. das ist viel sinniger!
dass es eigentlich nicht O(1) sein kann, sollte eigentlich fast klar sein, hab mich etwas verunsichern lassen.

zu 2 meld ich mich gleich noch, hab da noch eine Frage

  ─   danielainformatik 02.11.2020 um 12:17

Bei meiner frage kann ich wohl nicht "antworten", sondern nur kommentieren und deshalb kein Bild hinzufügen, deshalb siehe bild zu meiner Frage oben in Hauptthread

::: ich verstehe die letzten 3 Zeilen hier nicht ganz - falls mir das so überhaupt richtig dargestellt wird?? (hab es in einen "latex-übersetzer" gegeben, weil es hier nicht dargestellt wurde als formel)


1. wieso wird n nun quadiert, woran liegt das?
2. wo kommt der bruch her?
3. ist das "kleinerals"-zeichen nur ein Darstellungsfehler oder gehört das da hin? wenn es da hingehört: Warum?

sorry für die vielen Fragen, aber das thema ist nun wirklich nicht meins :)

  ─   danielainformatik 02.11.2020 um 12:31

  1. n wird quadriert, weil ja in jeder Klammer ein n steht, die "n" werden zusammengezählt, somit kommt eben "n" genau "n" mal vor und das ergibt n*n = n^2.

    2. Übrig bleibt 1+2+3+4+...+(n-1), das ist der "kleine Gauß". Wie berechnet man die Summe aller Zahlen von 1 bis n? Genau, mit n(n+1)/2. Da die Zahlen nur bis (n-1) gehen, sollte da eigentlich stehen "(n-1)n/2", was sich durch Einsetzen von "n-1" für das "n" in den kleinen Gauß einfach zeigen läßt (oder auch mit "n*(n+1)/2 - n"), hier ist mir ein kleiner Fehler passiert, spielt aber im weiteren keine Rolle, es wird ja auf "kleiner" abgeschätzt und da stimmts wieder.

    3. das mit dem "Kleinerals"-Zeichen dient nur zur Abschätzung, man hätte auch rechnen können, hab ich mir gespart :) Mit der Abschätzung kann man zeigen, daß, obwohl mehr abgezogen wird als notwendig, sich die Komplexität von n^2 nicht auf n verringert. Wenn Du willst, kannst Du natürlich rechnen und das dann abschätzen.
  ─   3des 02.11.2020 um 21:46

ach ja, warum hier im Board mathjax nicht funktioniert (wie im Matheboard) hab ich leider auch noch nicht begriffen, wäre schon prima... :(

  ─   3des 02.11.2020 um 21:56

jetzt hab ich es glaub ich auch verstanden. Danke

  ─   danielainformatik 03.11.2020 um 09:02

Ich hatte auch nix anderes erwartet ;)
Wenn man sich ein wenig damit beschäftigt, dann ist das kein Hexenwerk!

  ─   3des 03.11.2020 um 17:44

Kommentar schreiben