For t.type to each type schneller durchgehen

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Dusselchen14

Betreff: For t.type to each type schneller durchgehen

BeitragSo, Okt 24, 2010 3:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
Ich habe ein Problem:
sagen wir mal ich habe einen Type(nennen wir ihn mal test) mit ein paar Feldern und eins davon ist name$

Nun habe ich in einer Listbox jedes test\name$ drinstehen. Wenn der User nun etwas auswählt, mache ich das bisher in etwa so:

For t.test to each test
If Listbox_selected()= t\name$ then
;irgendwelcher quatsch
exit
endif
next

Funktioniert ja auch soweit. AAAABER Wenn man in dieser Listbox nun so ca. 5000 Einträge hat und der User wählt 4999 dauert das Ganze schon recht ewig.
Kann ich das irgendwie schneller feststellen welches *test* denn nun zum in der Listbox gewählten Eintrag gehört?
Hoffe ich habs verständlich erklärt.
Danke Schonmal!
 

n-Halbleiter

BeitragSo, Okt 24, 2010 3:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Arrays sind - so wie ich das sehe - das Mittel der Wahl. Wink

Zu nutzen in BB mit Dim.
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit
Ploing!
Blog

"Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935)
 

BBPro2

BeitragSo, Okt 24, 2010 8:20
Antworten mit Zitat
Benutzer-Profile anzeigen
blitz basic selbst kann das nicht so einfach und außer arrays gibt es keine naive lösung für das problem.
ich hab aus langeweile grad ma ein paar zeilen code zusammengebastelt die dir eventuell weiterhelfen können

es kann je nachdem wie dein programm aufgebaut ist zu geschwindigkeitsverbesserungen aber auch verschlechterungen führen, wenn du meinen code verwendest.
das kommt drauf an ob du öfter neue werte einfügst oder diese verwendest.
wenn du am anfang 5000 werte erstellst und einfügst und danach 3 stunden mit diesen arbeitest ist mein code bis zu 26 mal schneller als der naive
eigentlich soll der code mehr ein beispiel sein wie man sowas prinziepiell angehen könnte, vielleicht kriegst du das ganze auf deinen code angepasst und optimiert.

die idee dahinter ist es die type liste alphabetisch sortiert zu halten beim einfügen und jeweils auf das erste element eines buchstabens in einem array referenzen zu halten
wenn du also ein wort mit dem buchstaben m suchst gehst du zu dem ersten element in deiner liste, welches mit m beginnt und durchsuchst von dort aus so lange linear, bis du entweder das entsprechende wort gefunden hast oder bei n angelangt bist.
nichts anderes als eine mischung aus array und liste also

Code: [AUSKLAPPEN]

; voraussetzung: liste immer alphabetisch sortiert (beim erstellen von neuen elementen entsprechend einsortieren)

Graphics 640,480,16,2

Type test
   Field name$
   Field id
End Type

; liste von pointern auf das jeweils erste element mit einem bestimmten anfangsbuchstaben (27 zeigt auf 'null', sonst ggf Array out of Bounds später)
Dim pointer.test (27)


; ein paar testwerte
test.test = New test
   test\name$ = "Aal"
   test\id = 1

; immer drauf achten dass die pointer gesetzt werden, wenn ein neues element erstellt wird und dieses den neuen anfang für einen buchstaben bildet
pointer (1) = test.test

test.test = New test
   test\name$ = "Zebra"
   test\id = 2005

pointer (26) = test.test

test.test = New test
   test\name$ = "Zyste"
   test\id = 2006
   
; zyste soll gesucht werden   
suchen$ = "Zebra"


; entsprechenden buchstaben rausfinden und das 1. element mit 'Z' holen

offset = (Asc (Upper$ (Left$ (suchen$, 1))) - Asc ("A") + 1)
element.test = pointer (offset)
; durchsuchen bis element gefunden oder letztes element mit dem buchstaben aufgetaucht


While element <> pointer (offset + 1) And element <> After Last test
   If (element\name$ = suchen$) Then
      ergebnis.test = element
      Exit
   Else
      element = After element
   End If
Wend

; ergebnis ausgeben

Print ergebnis\name$
Print ergebnis\id


WaitKey
End

mpmxyz

BeitragSo, Okt 24, 2010 10:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Für dieses Problem eignen sich auch Binärbäume.
Diese übernehmen das sortieren komplett automatisch und sind zusätzlich nicht nur um einen Faktor schneller.
Eingeproggt hat hier eine Implementierung von einer solchen Baumstruktur erstellt:
https://www.blitzforum.de/foru...hp?t=34473
Ich würde aber den im Nachtrag erwähnten Code von darth eher empfehlen, da man dort mehrere Bäume erstellen kann und diese im ungünstigsten Fall schneller sind.
Beide Codes musst du aber direkt anpassen, um sie für deine Listen nutzen zu können.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Ana

BeitragSo, Okt 24, 2010 12:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich denke auch das ein Binärbaum eine sinnvolle sache wäre, aber im grunde steht dir die ganze Welt der Sortieralgorithmen offen. Wenn du bei großen Mengen nur einen einzelnen Type sucht ist das eigentlich immer sinnvoll einen komplexeren Algo. zu nehmen als die For schleife.

Außerdem würde ich dir nahe legen ihn selbst zu schreiben, das ist weder besonders schwierig noch besonders viel, aber vom prinzip finde ich es besser die Dinge ersteinmal verstanden zu haben, bevor man sie von anderen verwendet. (Auch wenn die ja im normalfall besser sind)

Vor einiger Zeit hab ich mal ein Programm geschrieben das Sortieralgorithmen erklärt (nicht den Code sondern die Idee) eventuell findest du da einen passenden
[link 2 tiefer]
Don't only practice your art,
but force your way into its secrets,
for it and knowledge
can raise human to divine
  • Zuletzt bearbeitet von Ana am So, Okt 24, 2010 12:33, insgesamt einmal bearbeitet

ToeB

BeitragSo, Okt 24, 2010 12:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Da kommt nur "Unable to set Graphic Mode"...

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Ana

BeitragSo, Okt 24, 2010 12:32
Antworten mit Zitat
Benutzer-Profile anzeigen
schande über alle die keine 1280x1024 auflösung hinbekommen!

und nen link http://dl.dropbox.com/u/10348730/Alg%26Dat.zip (ist nebenbei nicht fertig geworden nach der Klausur hatte ich keine lust mehr mich damit zu beschäftigen)
Don't only practice your art,
but force your way into its secrets,
for it and knowledge
can raise human to divine
 

Hangman

BeitragMo, Okt 25, 2010 15:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich weiß nicht wie viele Anweisungen du da durchführst, aber zum testen habe ich gerade einmal n kurzes Programm geschrieben bei dem folgendes passiert:

1.10000 Types werden durchlaufen
2. Jedem Type wird 1 String ausgelesen und verändert wieder reingeschrieben
3. Eine Variable wird ausgelesen und auf ID überprüft ob es der gesuchte Eintrag ist

Dauer: 0-1ms
Ich habe Berthold gebrochen.

NightPhoenix

BeitragMo, Okt 25, 2010 19:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich denke auch, dass seine Funktion da der Grund für die geringe Geschwindigkeit ist.
Code: [AUSKLAPPEN]
Listbox_selected()

Ich hatte selbst auch nie Probleme einige Tausend Typ-Einträge zu durchsuchen. Hat die FPS nicht merklich beeinflusst.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group