Hulli, irgendwie habe ich leider noch nicht verstanden, wie man die O-Notation bei einem Algorithmus herausfindet.
public class komplex {
/**
*1.) berechnet die ganzahlige Quadratwurzel von n. O(Wurzel(n))
*/
static int a(int n) {
int t = 1, z = 0;
while (n > 0) {
n -= t;
t += 2;
z++;
}
return z;
}
/**
* 2.) berechnet das Quadrat von n. Laufzeit O(n)
*/
public static int b(int n) {
int i = 0;
int b = 1;
while (++i < n)
b = b + 2 * i + 1;
return b;
}
/**
* 3.) berechnet den ganzahlige Logarithmus dualis von n. O(log2(n))
*/
static int c(int n) {
int z = 0;
while (n > 1) {
n /= 2;
z++;
}
return z;
}
/**
* 4.) berechnet Wurzel vom Quadrat von n. O(n) zunaechst Quadrat, dann daraus die
* Wurzel n+Wurzel(n^2)=n+n --> O(n)
*/
static int d(int n) {
return a(b(n));
}
/**
* 5.) berechnet Quadrat von Wurzel n. O(n) zunaechst Wurzel, dann davon das
* Quadrat Wurzel(n)+Wurzel(n)=2*Wurzel(n) --> O(Wurzel(n))
*/
static int e(int n) {
return b(a(n));
}
/**
* 6.) berechnet Wurzel vom Logarithmus von n. O(log2(n)) zunaechst Logarithmus,
* dann daraus die Wurzel log2(n)+Wurzel(log2(n))<2*log2(n) --> O(log2(n))
*/
static int f(int n) {
return a(c(n));
}
/**
* 7.) berechnet Wurzel von n + Logarithmus von n. O(Wurzel(n)), da
* Wurzel(n)+log2(n)<2*Wurzel(n)
*/
static int g(int n) {
return a(n) + c(n);
}
/**
* 8.) berechnet Quadrat von quadrat von n. O(n^2)
*
* n+n^2<2*n^2 --> O(n^2)
*/
static int h(int n) {
return b(b(n));
}
/**
* 9.) berechnet Wurzel n mal Wurzel n. O(n)
* Wurzel(n)+Wurzel(n)*Wurzel(n)=Wurzel(n)+n<2*n --> O(n)
*/
static int i(int n) {
int z = 0;
int y = a(n);
for (int i = 1; i <= y; i++)
z += a(n);
return z;
}
/**
* 10.) berechnet Wurzel n mal Wurzel n. O(n) Wurzel(n)*Wurzel(n)*2=2*n --> O(n)
*/
static int j(int n) {
int z = 0;
for (int i = 1; i <= a(n); i++)
z += a(n);
return z;
}
/**
* Hauptprogramm
*/
public static void main(String argv[]) {
int n;
do {
n = IO.readInt("Eingabe von n: ");
}
while (n < 1);
IO.print("a(" + n + ") =");
IO.println(a(n), 8);
IO.print("b(" + n + ") =");
IO.println(b(n), 8);
IO.print("c(" + n + ") =");
IO.println(c(n), 8);
IO.print("d(" + n + ") =");
IO.println(d(n), 8);
IO.print("e(" + n + ") =");
IO.println(e(n), 8);
IO.print("f(" + n + ") =");
IO.println(f(n), 8);
IO.print("g(" + n + ") =");
IO.println(g(n), 8);
IO.print("h(" + n + ") =");
IO.println(h(n), 8);
IO.print("i(" + n + ") =");
IO.println(i(n), 8);
IO.print("j(" + n + ") =");
IO.println(j(n), 8);
}
}
Alles anzeigen
Können wir mal die Methoden durchgehen?
1.) Verstehe absolut nicht... warum berechnet Quadratwurzel, und wieso ist es O(Wurzel(n) .
Er geht die while-Schleife durch und erniedrigt dabei n immer mehr. ja und?:D
2.)
/**
* 2.) berechnet das Quadrat von n. Laufzeit O(n)
*/
public static int b(int n) {
int i = 0;
int b = 1;
while (++i < n)
b = b + 2 * i + 1;
return b;
}
Alles anzeigen
Dass es das Quadrat berechnet ist klar, aber wieso ist die Laufzeit o(n) ?
While Schleife wid n mal durchlaufen, dabei macht es eine mathematische Operation (ist diese denn wichtig bzw. zu beachten bei der Laufzeitangabe??) ... und nu?
3.)
/**
* 3.) berechnet den ganzahlige Logarithmus dualis von n. O(log2(n))
*/
static int c(int n) {
int z = 0;
while (n > 1) {
n /= 2;
z++;
}
Alles anzeigen
n-1 mal die schleife, dann n immer halbiert... auch keine ahnung wie man auf O(log2*n) kommt
So erstmal die drei, kann mir das einer von den Meistern Yodas hier helfen ? :devil:
thxschonmal ciao