Schnelleres _ArrayMax auf Numerischer Basis

  • Hallo AutoIt Com.
    Heute habe ich mich mit dem Plane-Sweeping Algorithmusentwurfsverfahren auseinandergesetzt und versucht _ArrayMax() nachzucoden.
    Noch fehlen die Optionen: Alphanumerisch, Start, End.
    Zusätzlich hat es die Funktion Type - Herausgabe des Größten / Kleinsten Wertes.

    Insgesamt ist die Funktion schneller als die Funktion _arraymax(), ein Beispiel dafür:

    Spoiler anzeigen
    [autoit]

    ;Sweep Verfahren
    ;Methode: Scanne ALLES und trage dann Ergebnis aus
    #include <Array.au3>
    #Region Variables
    Global $RArray = _RandomValue(1000)
    Global $EndValue
    #EndRegion Variables
    #Region Returns
    $STimer = TimerInit()
    $EndValue = _SweepArray($RArray)
    $STimer = Round(TimerDiff($STimer), 4)
    $ATimer = TimerInit()
    $AEndValue = _ArrayMax($RArray)
    $ATimer = Round(TimerDiff($ATimer), 4)
    MsgBox(0, "Auswertung", "Array Max: " & $AEndValue & @CRLF & "Array Zeit: " & $ATimer & @CRLF & @CRLF & "PS Max: " & $EndValue & @CRLF & "PS Zeit: " & $STimer)
    #EndRegion Returns
    #Region Functions
    Func _SweepArray($Array, $Type = True)
    If Not IsArray($Array) Then Return False
    Local $Wert = $Array[0]

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

    If $Type = True Then
    For $i = 0 To UBound($Array) - 1
    If $Array[$i] > $Wert Then $Wert = $Array[$i]
    Next
    ElseIf $Type = False Then
    For $i = 0 To UBound($Array) - 1
    If $Array[$i] < $Wert Then $Wert = $Array[$i]
    Next
    EndIf
    Return $Wert
    EndFunc ;==>_SweepArray
    #cs
    ;$Array = Array with Values
    ;$Type = True - Return highest Value
    ; False - Return lowest Value
    #ce
    Func _RandomValue($iAnzahl, $iVon = 1, $iBis = 10000) ;Return Array
    If $iAnzahl > $iBis - $iVon Then $iBis = $iVon + $iAnzahl
    Local $oRandom = ObjCreate("Scripting.Dictionary")
    For $i = 1 To $iAnzahl
    Do
    $tmp = Random($iVon, $iBis, 1)
    Until Not $oRandom.Exists($tmp)
    $oRandom.Add($tmp, $i)
    Next
    $colRandom = $oRandom.Keys
    Local $aRandom[$iAnzahl], $i = 0
    For $Random In $colRandom
    $aRandom[$i] = $Random
    $i += 1
    Next
    Return $aRandom
    EndFunc ;==>_RandomValue
    #EndRegion Functions

    [/autoit]

    Die Funktion selber:

    [autoit]


    ; #FUNCTION# ===================================================================
    ; Name ..........: _SweepArray
    ; Description ...: Returns highest Number of Array
    ; AutoIt Version : -
    ; Syntax ........: _SweepArray($Array [,$Type = True])
    ; Parameter(s): .: $Array -
    ; Return Value ..: Success - Highest / Lowest value of Array.
    ; Failure - False
    ; Author(s) .....: Mattthias (AutoIt.de)
    ; Date ..........: Sunday 27.02.2011 21:30
    ; Link ..........:
    ; Related .......:
    ; Example .......: Yes
    ; ==============================================================================
    Func _SweepArray($Array, $Type = True)
    If Not IsArray($Array) Then Return False
    Local $Wert = $Array[0]

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

    If $Type = True Then
    For $i = 0 To UBound($Array) - 1
    If $Array[$i] > $Wert Then $Wert = $Array[$i]
    Next
    ElseIf $Type = False Then
    For $i = 0 To UBound($Array) - 1
    If $Array[$i] < $Wert Then $Wert = $Array[$i]
    Next
    EndIf
    Return $Wert
    EndFunc ;==>_SweepArray

    [/autoit]


    Demnächst sollte noch kommen: Alphanumerisch, Start, End
    MfG

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Ich hoffe du willst mir nichts unterstellen, das sollte lediglich ein Bsp für Plane-Sweeping Algorithmusentwurfsverfahren sein.
    Es läuft bei mir trotzdem um so 200-400 MS bei den Veidpiel schneller

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Ich bin kein Informatiker und es kann daher durchaus sein das ich falsch liege aber soweit ich mich erinnern kann ist eine Voraussetzung für einen Sweep mindestens 2 Dimensionen.
    Wenn du hier direkt von einem Plane-Sweeping sprichst müsste es sich dabei sogar genau um ein 3-Dimensionales Problem handeln.
    Du hast jedoch hier nur eine Dimension und daher ist das einfach nur ein simples Durchlaufen eines Arrays.

    Edit: Wie ich nun gelesen habe gibt es Sweeps auch im eindimensionalen (>>Quelle<<).
    Ob man diesen simplen Gedankengang dann so hochtrabend bezeichnen muss ist Ansichtssache aber so oder so handelt es sich hier nicht, wie angegeben, um ein Plane-Sweeping.
    Ein Mehrwert ist hier für mich auch nicht erkennbar.
    Wenn man ein Beispiel für einen 1-dimensionalen Sweep zeigen möchte hätte das schon vorhandene _ArrayMax() diesen Anspruch schon vorher erfüllt.

    3 Mal editiert, zuletzt von AspirinJunkie (28. Februar 2011 um 10:49)

  • Ja ich weiss eigentlich war es nur eine Idee des Sweep-Algorithmusentwurfsverfahren.
    Eigentlich wollr ich nur ArrayMax nachcoden, mfG

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Sieh es doch bitte eher als gutgemeinten Hinweis.
    Wie ich das so mitbekommen habe machst du das um an einem Wettbewerb teilzunehmen?
    Die Aufgabenstellung dort war ja aber ein Plane-Sweeping und wenn du dann dies hier dazu abgibst ist das ja schon am Thema vorbei.
    Es war also ein Hinweis das das kleine Wörtchen "Plane" einen gewaltigen Einfluss auf die Aufgabenstellung hat und nicht übersehen werden sollte.