ENGLISH VERSION |
|
Links | | | Forum | | | Kommentare | | | News melden |
Chat | | | Umfragen | | | Newsticker | | | Archiv |
amiga-news.de Forum > Programmierung > add Node to List sorted Algorithmus | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
-1- | [ - Beitrag schreiben - ] |
30.12.2011, 13:07 Uhr AGSzabo Posts: 1663 Nutzer |
Hallo, hat zufällig jemand einen Algo im Kopf, mit dem ich eine Node in eine Exec-Liste an der alphabetisch richtigen Position einfügen kann? Pseudocode reicht. ags -- Author of Open eXternal User Interfaces - Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux [ - Antworten - Zitieren - Direktlink - ] |
30.12.2011, 13:34 Uhr thomas Posts: 7718 Nutzer |
Fang am Anfang der Liste an und suche die erste Node, die größer ist als die neue und füge die neue davor ein. Wenn zu erwarten ist, dass die reinkommenden Einträge größtenteils schon sortiert sind, dann ist es vielleicht besser, am Ende der Liste anzufangen und rückwärts die erste Node zu suchen, die kleiner ist. Oder du machst es so, dass du von vorne suchst, wenn die neue mit A bis M anfängt und von hinten bei N bis Z. Solange die Nodes nur einfach verkettet sind, läuft es jedenfalls immer auf eine sequentielle Suche heraus. -- Email: thomas-rapp@web.de Home: thomas-rapp.homepage.t-online.de/ [ - Antworten - Zitieren - Direktlink - ] |
30.12.2011, 13:40 Uhr Thore Posts: 2266 Nutzer |
Wenn die Liste lang wird, kann auch eine Interpolationssuche in Frage kommen. Du fängst in der Mitte an. Kommt dein Text vorher, dann such im linken Block weiter, kommt er später, im rechten Block. Aus diesem Block suchst du nun wieder die Mitte und dann den linken oder rechten Teil dieses Blocks. Das geht natürlich nur in sortierten Listen. Aber das ist deine ja ohnehin, wenn du von Anfang an sortierst durch Einfügen. Der Vorteil ist hier bei langen und sehr langen Listen, weil man mit wenigen Sprüngen zum Ziel kommt. Bei kurzen Listen ist sequenziell besser, da der Aufwand der Interpolationssuche größer sein kann als das durchforsten weniger Listen-Einträge. [ Dieser Beitrag wurde von Thore am 30.12.2011 um 13:41 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
30.12.2011, 14:10 Uhr AGSzabo Posts: 1663 Nutzer |
Das Directory hat 2000 Files und es geht jetzt mit der sequentiellen Suche berauschend schnell. Auch das Refreshen passiert jetzt im Intuiticks-Takt. Der Flaschenhals war tatsächlich die Bubble-Sortierung nach jedem neuen Eintrag. Außerdem speichere ich die Nodes nimmer zwischen, sondern hänge sie nach dem Einlesen des Dateieintrages direkt gleich in die Liste. Refresht wird aber nur wenn ein Tick kommt und auch nur dann wenn nicht gerade schon refresht wird. Hier zum Überblick mein AddSorted code: code:LV_addsorted bsr new_row push d0 beq .pop move.l d0,a1 move.l oxLV_contentgroup(a3),a0 pushm a0/a1 sub.l a2,a2 ; get new node texts, add at head if none move.l a1,a0 move.w #oxLRA_texts,d0 jsr _LVOoxGetAttr(a6) tst.l d0 beq .add ; get first column text of new node, add head if none move.l d0,a4 move.l (a4),d0 beq .add move.l d0,a4 ; get first (and next) node, add at head if none move.l (a7),a0 lea oxO_list(a0),a3 .loop move.l (a3),a3 tst.l (a3) beq .add ; get that node texts, skip if none move.l a3,a0 move.w #oxLRA_texts,d0 jsr _LVOoxGetAttr(a6) tst.l d0 beq .loop ; get first column text of that node, skip if none move.l d0,a0 move.l (a0),d0 beq .loop move.l d0,a0 move.l a4,a1 bsr .strcmp bgt .add move.l a3,a2 bra .loop .add popm a0/a1 jsr _LVOoxAddMemberAfter(a6) tst.l d0 beq .dispose .pop pop d0 rts .dispose pop a0 jsr _LVOoxDispose(a6) moveq #0,d0 rts .strcmp ; a0 string1, a1, string2 moveq #0,d0 moveq #0,d1 .loop1 move.b (a1)+,d1 bclr #5,d1 ; case independent move.b (a0)+,d0 beq.s .exit1 bclr #5,d0 cmp.b d0,d1 beq.s .loop1 .exit1 sub.l d1,d0 rts Da es so schnell genug geht und Directorys selten mehrere Tausend Einträge haben (?), verzichte ich auf die Interpolationssuche oder ähnliches. Ich weiß auch momentan garnicht, wie ich da schneller als jetzt schon ist immer die Mitten finden kann. Meine Methode wirkt ein bischen aufgeblasen, das rührt daher, dass man a) in einer späteren Version auch nach anderen Spalten soriteren können muss und b) dass die Listview die für das Adden zuständig ist, den Offset für den Zeiger auf das Spaltentexte-Zeiger Array im Listenzeilen-Objekt nicht kennt. danke -- Author of Open eXternal User Interfaces - Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux [ Dieser Beitrag wurde von AGSzabo am 30.12.2011 um 14:13 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
30.12.2011, 19:20 Uhr Thore Posts: 2266 Nutzer |
>Ich weiß auch momentan garnicht, wie ich da schneller als jetzt schon ist immer die Mitten finden kann. Das ist einfach. Jeder Node bekommt seine Position als ID und du speicherst in der Hauptklasse der Liste (oder der Struct) einfach die Anzahl der Items mit. Aber wenn es nur für Directories ist, hast du vll maximal 15000 Einträge, da ist sequenzielle/lineare Suche noch erträglich. Freut mich wenns so klappt. [ - Antworten - Zitieren - Direktlink - ] |
30.12.2011, 19:27 Uhr AGSzabo Posts: 1663 Nutzer |
@Thore: Das verstehe ich noch nicht. Wie hilft mit die Anzahl der Nodes beim Finden der Mitte? -- Author of Open eXternal User Interfaces - Sam mini os4.1 upd. 2 / e-uae 39bb2 / A4000D 3.0 & 3.9 2mbchip 8mbfast Ariadne_II ide DVD und HD / A500 3.1 (mkick) adide 50mb / Athlon ii X2 Ubuntu Linux [ - Antworten - Zitieren - Direktlink - ] |
30.12.2011, 21:59 Uhr Der_Wanderer Posts: 1229 Nutzer |
Ich würde auf jedenfall das Sortieren auf O(n*log(n)) drücken, d.h. Quicksort oder Binärsuche (http://de.wikipedia.org/wiki/Bin%C3%A4re_Suche) zum Einfügen. Du musst für den Fall optimieren, wenn es viele Einträge sind, nicht versuchen zu sparen wenn es wenig Einträge sind. Wenn es wenige sind, dann ist es immer schnell genug. -- -- Author of HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr... Homepage: http://www.hd-rec.de [ Dieser Beitrag wurde von Der_Wanderer am 30.12.2011 um 22:00 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
30.12.2011, 22:03 Uhr AGSzabo Posts: 1663 Nutzer |
Ich war auf Bubblesort. Das war in jedem Fall zu langsam. Das Adden an der richtigen Position ist mir schnell genug, bzw quicksort oder gar binärsort versteh ich vorne und hinten nicht. Interessant wäre evtl noch diese Interpolationssuche... ps: ich möchte jetzt noch mit rein nehmen, dass zusätzlich zum Alfabet als Kriterium eine Node Priorität verwendet wird. Damit kann man dann Verzeichnisse an den Anfang stellen. Wie berücksichtigt man das im Algo? [ Dieser Beitrag wurde von AGSzabo am 30.12.2011 um 22:22 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
30.12.2011, 23:10 Uhr Der_Wanderer Posts: 1229 Nutzer |
Deine Vergleichsfunktion muss bei Verzeichnissen größer (oder kleiner) als Files zurückgeben. Die Vergleichsfunktion muss also die Information haben. Im simpelsten Fall stellst du jedem Verzeichnis ein "a" vornedran, und jedem File ein "b". Aber ich würde das als extra Parameter für die Vergleichsfunktion machen. ... oder, wenn es fix immer diese Zeit Kategorien gibt, dann lege einfach zwei Listen an. -- -- Author of HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr... Homepage: http://www.hd-rec.de [ Dieser Beitrag wurde von Der_Wanderer am 30.12.2011 um 23:11 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
03.01.2012, 12:06 Uhr Holger Posts: 8116 Nutzer |
Zitat:Ist das wirklich ein Problem für Dich? 1. Überprüfe nach wichtigerem Kriterium. Wenn ungleich ⇒ fertig 2. Ansonsten überprüfe nach zweitwichtigem Kriterium Du kannst beliebig viele Vergleichskriterien zu einem zusammenfassen. Darauf sollte man aber wirklich von selbst kommen. Wie packst Du Schuhe in ein Regal? -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
03.01.2012, 12:07 Uhr AGSzabo Posts: 1663 Nutzer |
@Holger: > Ist das wirklich ein Problem für Dich? das hab ich schon längst gelöst. -- Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system. [ - Antworten - Zitieren - Direktlink - ] |
03.01.2012, 12:25 Uhr Holger Posts: 8116 Nutzer |
Zitat:War es wirklich ein Problem für Dich? Oder stellst Du auch gerne mal Fragen, bevor Du selber drüber nachdenkst? [ - Antworten - Zitieren - Direktlink - ] |
03.01.2012, 12:30 Uhr AGSzabo Posts: 1663 Nutzer |
@Holger: Es war mir nicht gleich ganz klar. Ich hatte darüber schon nachgedacht. -- Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system. [ - Antworten - Zitieren - Direktlink - ] |
-1- | [ - Beitrag schreiben - ] |
amiga-news.de Forum > Programmierung > add Node to List sorted Algorithmus | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
Impressum |
Datenschutzerklärung |
Netiquette |
Werbung |
Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten. |