| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: In einem Array suchen (7716 mal gelesen)
|
Cookiie Mitglied
Beiträge: 32 Registriert: 20.06.2005
|
erstellt am: 11. Jul. 2005 11:42 <-- editieren / zitieren --> Unities abgeben:
Hi Leute, ich habe ein Array mit über 3600 werten darin. Und möchte nun direkt auf ein Element zugreifen können, ohne das Ganze Array mit einer Schleife durchforsten zu müssen. Es würde auch gehen wenn ich den Index, wo der Wert gespeichert ist zurückgeliefert bekomme. Hintergrund ist eine Bauteilliste die ich durchsuche um den richtigen wert zu finden, bei ner Leiterplatte mit 2000 Bauelementen entsprechend 2000 x 3600 Schleifendurchgänge, was sehr zeitintensiv ist. Ein Direktzugriff würde dies ziemlich beschleunigen. Gruß Cookiie Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
startrek Mitglied Architekt
Beiträge: 1361 Registriert: 13.02.2003 Veni, Vidi, VW ... I came, I saw, I drove around in a little car.
|
erstellt am: 11. Jul. 2005 13:19 <-- editieren / zitieren --> Unities abgeben: Nur für Cookiie
Hi Cookie, fürchte mit 'normalen' Arrays haste da schlechte Karten, bleibt IMHO nur die Schleife. Prüfen, ob ein Wert überhaupt vorkommt kannst evtl. mit Filter(), also so in etwa: If UBound(Filter(deinArr, "deinWert")) = -1 Then MsgBox "not exists" Ansonsten bleiben Collections oder Dictionary als Alternative;-)
Code:
Sub test() Dim mydic As New Scripting.Dictionary mydic.Add "key1", "one" mydic.Add "key2", "two" mydic.Add "key3", "three" Debug.Print mydic("key1"), mydic.Items(2), mydic.Keys(0) mydic("key1") = "wasanderes" Debug.Print mydic("key1") End Sub
lg Nancy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Cookiie Mitglied
Beiträge: 32 Registriert: 20.06.2005
|
erstellt am: 11. Jul. 2005 14:00 <-- editieren / zitieren --> Unities abgeben:
Hm, hab ich fast befürchtet. Das mit den Collections, da müßte ich mein ganzes Programm jetzt umschreiben und das wäre doof, zumal das jetzige läuft und voll funktional ist. Wäre ja nur aus Performance gründen nett. Hab ja eh schon nen Schleifenabbruch drin wenn ers gefunden hat, was das ganze schonmal reduziert. Aber habs mal gemessen, bei 2000 Teilen braucht er knapp 1:42min. Was eigentlich noch schnell genug ist. Will bloß nicht wissen wie lange der auf ner älteren Machine braucht ^^. Aber trotzdem danke. Gruß Cookiie Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
startrek Mitglied Architekt
Beiträge: 1361 Registriert: 13.02.2003 Veni, Vidi, VW ... I came, I saw, I drove around in a little car.
|
erstellt am: 11. Jul. 2005 16:52 <-- editieren / zitieren --> Unities abgeben: Nur für Cookiie
... quick'n dirty noch, allerdings je quick desto dirty Code:
Sub asdf() Dim src, a, b, x, y x = 3: y = "blabla" src = Array(1, 2, 3, 1, 2) a = Filter(src, x): b = Filter(src, x, 0) If Not CBool(UBound(a)) Then ReDim Preserve b(LBound(b) To UBound(b) + 1) b(UBound(b)) = y: src = b Else: MsgBox "matches <> 1" End If End Sub
lg Nancy [Diese Nachricht wurde von startrek am 11. Jul. 2005 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Cookiie Mitglied
Beiträge: 32 Registriert: 20.06.2005
|
erstellt am: 12. Jul. 2005 14:33 <-- editieren / zitieren --> Unities abgeben:
Du bist aber ein pöses Mädchen ;-). Hab jetzt einfach ne Abart der binären Suche implementiert. Code:
Sub BinaereSuche(wert As Variant, arr As Variant) Dim i As Integer, k As Integer Dim schleifen As Integer Dim gefunden As Boolean, ende As Boolean Dim grenze gefunden = False schleifen = 0 i = (UBound(arr, 2) + 1) / 2 k = i Do Until ende k = k / 2 + k Mod 2 If wert < arr(0, i) Then i = i - k Else i = i + k End If schleifen = schleifen + 1 If wert = arr(0, i) Then gefunden = True ende = True End If grenze = Log((UBound(arr, 2) + 1)) / Log(2) If schleifen > grenze Then ende = True End If Loop If gefunden Then MsgBox arr(1, i) Else MsgBox "Wert nicht vorhanden." End If End Sub
Das ganze benötigt einen Suchwert und ein vorsortiertes Array, sonst funktioniert es nicht. Ist aber aufgrund der logarithmisches Suche sehr schnell. Gruß Cookiie, nicht ganu so quick aber trotzdem dirty ^^ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|