samedi 30 mai 2015

Komplexität Fibonacci

Erstmal guten Abend Leute,

im folgenden eine kleine Frage, die nach ein wenig herumspielen entstanden ist. In Vorlesungen (und auch im Internet) finde ich immer wieder die Komplexität für die Berechnung der Fibonacci Folgen mit O(n) [iterativ] und O(2^n) [rekursiv]
Ist ja auch entsprechend der Funktionen sinnvoll. Hab das ganze jetzt einmal in Java Code Umgesetzt und die Zeit gemessen- jetzt wüsst ich gern, ob mir jemand erklären kann warum die Ergebnisse doch recht auffällig von der zu erwartenden Zeit abweichen. (Zum ersten mal in diesem Forum aktiv- hoffe einfach mal, jetzt keine groben Formfehler begangen zu haben)

Erstmal das Ergebnis der Ausgabe (Eingabe 50)

Iterativ 12586269025 Zeit: 0.009179 Sekunden


Rekursiv 12586269025 Zeit: 0.00378 Sekunden


Endrekursiv 12586269025 Zeit: 0.016739 Sekunden

und im Folgenden noch der Code

Java Code:

  1.  
  2. public static void main(String[] args) {
  3. test(50);
  4. }
  5.  
  6. public static void test(int n)
  7. {
  8. long before = System.nanoTime();
  9. long fib =fib_it(n);
  10. long after = System.nanoTime();
  11. System.out.println("Iterativ "+fib+" Zeit: "+((double)after-before)/1000000+" Sekunden");
  12. //
  13. System.out.println();
  14. //
  15. before = System.nanoTime();
  16. fib =fib_it(n);
  17. after = System.nanoTime();
  18. System.out.println("Rekursiv "+fib+" Zeit: "+((double)after-before)/1000000+" Sekunden");
  19. //
  20. System.out.println();
  21. //
  22. before = System.nanoTime();
  23. fib =fib_tail(n);
  24. after = System.nanoTime();
  25. System.out.println("Endrekursiv "+fib+" Zeit: "+((double)after-before)/1000000+" Sekunden");
  26. }
  27.  
  28. public static long fib_it(int n)
  29. {
  30. long tmp0 = 1;
  31. long tmp1 = 1;
  32. if(n == 1 || n == 0) return 1;
  33. else{
  34. for(int i = 1; i<n; i++)
  35. {
  36. long help = tmp1 + tmp0;
  37. tmp0 = tmp1;
  38. tmp1 = help;
  39. }
  40. return tmp0;
  41. }
  42. }
  43.  
  44.  
  45. public static long fib_rec(long n)
  46. {
  47. if(n == 1) return 1;
  48. else return fib_rec(n-1)+fib_rec(n-2);
  49. }
  50.  
  51. public static long fib_tail(int n)
  52. {
  53. if(n == 1 || n == 0) return 1;
  54. return _fib_tail(n, 0, 1, 0);
  55. }
  56.  
  57. public static long _fib_tail(int n,long decN,long decdecN, long acc)
  58. {
  59. if(n == 1 || n == 0)return acc;
  60. else{
  61. return _fib_tail(n-1, decdecN, decN+decdecN, decN+decdecN);
  62. }
  63. }


Komplexität Fibonacci

0 commentaires:

Enregistrer un commentaire