For t.type to each type schneller durchgehen
Übersicht BlitzBasic Allgemein
Dusselchen14Betreff: For t.type to each type schneller durchgehen |
So, Okt 24, 2010 3:21 Antworten mit Zitat |
|
---|---|---|
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 |
So, Okt 24, 2010 3:34 Antworten mit Zitat |
|
---|---|---|
Arrays sind - so wie ich das sehe - das Mittel der Wahl.
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 |
So, Okt 24, 2010 8:20 Antworten mit Zitat |
|
---|---|---|
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 |
So, Okt 24, 2010 10:41 Antworten mit Zitat |
|
---|---|---|
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 |
So, Okt 24, 2010 12:10 Antworten mit Zitat |
|
---|---|---|
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 |
So, Okt 24, 2010 12:25 Antworten mit Zitat |
|
---|---|---|
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 |
So, Okt 24, 2010 12:32 Antworten mit Zitat |
|
---|---|---|
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 |
Mo, Okt 25, 2010 15:00 Antworten mit Zitat |
|
---|---|---|
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 |
Mo, Okt 25, 2010 19:42 Antworten mit Zitat |
|
---|---|---|
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. |
||
Übersicht BlitzBasic Allgemein
Powered by phpBB © 2001 - 2006, phpBB Group