Binomialkoeffizient

  • Irgendwie schaffe ich es nicht einen Javacode (der funzt tadellos)
    nach AutoIt zu portieren...
    - Mir gehts um einen Performancetest, ob die rekursive Methode schneller
    als meine ist, da meine Funktion die Fakultät nicht vollständig ausrechnet und somit
    auch höhere Berechnungen schafft, im Gegensatz zu fak(n)/(fak(k) * fak(n-k))-
    Vielleicht übersehe ich ja etwas :S

    Quelle des Javaalgorithmus.

    Meine Umsetzung:

    Spoiler anzeigen
    [autoit]

    Func nueberk($n,$k) ; Mein Algorithmus
    $a=1
    For $i=$n To ($n-$k+1) Step -1
    $a *= $i/(Abs($i-$n)+1)
    Next
    Return $a
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func binom($n,$k) ; Rekursion - scheint endlos zu laufen
    If($k=0 Or $k=$n) Then
    Return 1
    ElseIf $k=1 Then
    Return $n
    Else
    Return binom($n-1,$k)+binom($n-1,$k-1)
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Local $a,$b,$c
    $a = TimerInit()
    nueberk(49,6)
    $b = TimerDiff($a)
    $a = TimerInit()
    binom(49,6)
    $c = TimerDiff($a)

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0,"Diff","Mein Algorithmus: "&$b&@CRLF&"Rekursion: "&$c)

    [/autoit] [autoit][/autoit] [autoit]

    $a = TimerInit()
    nueberk(5000,2313)
    $b = TimerDiff($a)
    $a = TimerInit()
    binom(5000,2313)
    $c = TimerDiff($a)

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0,"Diff","Mein Algorithmus: "&$b&@CRLF&"Rekursion: "&$c)

    [/autoit]


    Edit1: Nach einer halben Ewigkeit kam die Rekursion (49,6) zu einer Lösung,
    doch warum ist die Zeitmessung bei meinem Algorithmus so seltsam? (viel zu hohe Angabe)
    Java gibt mir die Lösung 'sofort', wohingegen AutoIt endlos zu Rechnen scheint...
    SO langsam ist AutoIt doch nicht, oder?

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

    Einmal editiert, zuletzt von XovoxKingdom (16. Oktober 2011 um 17:58)

  • Deine Funktion funktionier super :D nur Autoit ist dafür einfach zu langsam man braucht für 49 und 6 ganze 3424607 durchläufe ich schreib dir mal was

  • Da bin ich mal gespannt :D

    Hier ein Update meines (selbst entwickelt *stolz sei*) Algorithmus:

    Spoiler anzeigen
    [autoit]

    Func nueberk($n,$k) ; Mein Algorithmus
    $c=0 ; schrittanzahl
    $a=1
    If ($k >= $n/2) Then
    For $i=1 To ($n-$k)
    $a *= ($n-$i+1)/$i
    $c+=1
    Next
    Else
    For $i=$n To ($n-$k+1) Step -1
    $a *= $i/($n-$i+1)
    $c+=1
    Next
    EndIf
    ConsoleWrite("Anzahl Schritte: "&$c&@CRLF)
    Return $a
    EndFunc

    [/autoit]


    Kann man den noch toppen (=optimieren)?
    hier: optimieren = schneller machen - nicht: fehlerbehandlung. :P
    EDIT: wenn ich mich nicht irre, dann braucht er O(k) im schlechtesten Fall [k = n/2] :)
    im besten natürlich O(~1) = konst.

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

    Einmal editiert, zuletzt von XovoxKingdom (16. Oktober 2011 um 18:44)

  • Ich wollt es dir in InlineASM schreiben aber mein Problem ist ich habe Kaum geschlafen und habe Bauch und Kopfschmertzen also kann ich so net gscheit arbeiten