amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Wieviele Files in Dir? [ - Suche - Neue Beiträge - Registrieren - Login - ]

1 -2- 3 [ - Beitrag schreiben - ]

05.01.2012, 13:17 Uhr

AGSzabo
Posts: 1663
Nutzer
@Holger:

> Das wusstest Du aber nicht. Trotzdem hast Du angenommen, dass es schneller wäre.

Ich hatte angenommen, dass der vorhandene Code schneller ist, weil er mit einem Test weniger aus kommt. Warum genau das so ist hat sich er erst dann geklärt.

> Andererseits frag ich mich immer noch, wo da die Zeit verbraten werden soll, bei 2000 Einträgen und dem gezeigten Assembler-Code.

Inzwischen arbeite ich mit einem Test von 8860 Einträgen. Auf 2000 springt der Zähler so schnell, dass es gleich am Anfang da zu sein scheint. Allerdings nur auf meiner Turbo-Maschine mit 2x 2700 Mhz.

Übrigens ist mir der Einfrier-Hänger jetzt auch beim ASL Requester und beim "list" in der Shell aufgefallen. Könnte ein Problem des UAE sein.

Den Suchalgo hab ich noch nicht ganz verstanden. Im Moment habe ich durchaus sehr viele ähnliche Strings, weil ich einfach den Directory-Inhalt 8x geklont habe um so viele Dateien zu erhalten. ;)
--
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 - ]

05.01.2012, 13:49 Uhr

Thore
Posts: 2266
Nutzer
> Den Suchalgo hab ich noch nicht ganz verstanden.

Ein Beispiel mit Zahlen

Suche der Zahl 8 von 20 sortierten Einträgen:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Nehme das mittlere Element: 11
Vergleiche es mit der 8: Kleiner als 11

Nehme die linke Hälfte da kleiner.

0 1 2 3 4 5 6 7 8 9 10
Nehme das mittlere Element: 5
Vergleiche es mit der 8: Größer als 5

Nehme die rechte Hälfte da größer.

6 7 8 9 10

Nehme das mittlere Element: 8
Vergleiche es mit der 8: gefunden in 3 Schritten.


Ach ja: Du brauchst nicht so viele Dateien zum Testen.
Mach Dir doch ein Fake-Directory im Beispielcode (z.B. ne Textdatei mit tausenden Einträgen) und lese einfach die Strings ein.
So kannst Du den Sortier-Einfüge Algo separat mal testen mit extrem vielen Einträgen ohne die Festplatte vollzumüllen.


[ Dieser Beitrag wurde von Thore am 05.01.2012 um 13:51 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

05.01.2012, 14:54 Uhr

AGSzabo
Posts: 1663
Nutzer
@Thore:

> ... Vergleiche es mit der 8: gefunden in 3 Schritten.


Soweit klar. Woher weiß ich, wann wo die Mitte ist?
--
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 - ]

05.01.2012, 15:06 Uhr

Thore
Posts: 2266
Nutzer
Die Anzahl weißt Du, wenn du sie mitschreibst.
Anzahl / 2 (gerundet) = Pivot

Dieses ist der Index deines mittleren Elements. Wie du das findest, da gibts mehrere Wege, z.B. wie Holger es beschrieb: Pivot mal dein Next aufrufen.
Dieser Index ist dann beim nächsten Schritt der Anfang oder das Ende der neuen Menge (je nach dem ob linke oder rechte Hälfte genommen wurde)

[ Dieser Beitrag wurde von Thore am 05.01.2012 um 15:07 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

05.01.2012, 15:46 Uhr

AGSzabo
Posts: 1663
Nutzer
Ich hab grad wieder auf ExAll() umgestellt. Mit einem größeren Buffer bringt es tatsächlich auch auf einem langsamen Gerät ein paar Sekunden. Den Algo habe ich soweit begriffen. Man könnte auch von Anfang an einen Zeiger auf das erste Element merken, und dann immer nach zwei neuen Nodes um 1 Node weiter gehen. So hat man immer die Mitte ohne die hälfte der Nodes bis dahin durchzugehen. Klappt das aber nur mit der Mitte, oder gibt es eine Möglichkeit, dieses Verfahren auf alle Schritte auszuweiten?

ps: mit ExAll() hab ich auch gratis das Patternmatching mit drin, das ist sehr nett. :)

--
Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system.

[ Dieser Beitrag wurde von AGSzabo am 05.01.2012 um 15:47 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

05.01.2012, 16:15 Uhr

Thore
Posts: 2266
Nutzer
Das Pivot-Element kann man beliebig wählen, allerdings sinkt damit die Effizienz, wenn es nicht die Mitte ist. Im besten Fall findest du schneller, im schlechten Fall langsamer. Mit der Mitte hast Du eben das Optimum.
Bei geraden Anzahlen gibt es keine Mitte, da ist es Dir freigestellt welche der zwei mittleren Elemente Du nimmst.

[ - Antworten - Zitieren - Direktlink - ]

05.01.2012, 16:22 Uhr

AGSzabo
Posts: 1663
Nutzer
@Thore:

Ne, ich meine ich muss im zweiten Schritt die Mitte von der hälfte nehmen. Die erste Mitte kann ich wie oben beshrieben durch weitergehen zum nächsten Element nach allen zwei neuen Nodes merken. Die Frage war, ob ich die Mitte der Hälfte auch in etwa so ermitteln kann oder ob ich da dann durch die Hälfte der Hälfte Nodes steigen muss? Und so weiter.
--
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 - ]

05.01.2012, 16:34 Uhr

Thore
Posts: 2266
Nutzer
Im Grunde kannst du es "auch einfach so schätzen". Ist allerdings wie erwähnt nicht mehr ganz effizient.

Die neue Mitte kannst du aber auch ausrechnen


[ Dieser Beitrag wurde von Thore am 05.01.2012 um 16:35 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

05.01.2012, 17:06 Uhr

AGSzabo
Posts: 1663
Nutzer
@Thore:

Zitat:
Kannst du doch einfach berechnen
Bei linker Seite:
Neues Pivot = altes Pivot / 2
Bei rechter Seite:
Neues Pivot = Altes Pivot + ((Anzahl - Neues Pivot) / 2)


Ah ja, so ginge das. Ich müsste bei jedem Einfügen alle Nodes bis zum ersten Pivot durch steppen (Anzahl / 2), diesen vergleichen und dann von dort aus zB die eben Ermittelte Zahl wieder durch zweit teilen und vorwärts oder rückwärts so viele Nodes durch gehen. Dort wieder vergleichen und so weiter, bis 0 raus kommt, oder 1? Oder was sonst?

Ich denke aber über eine noch weitere Beschleunigung nach:

Ich merke mir den Anfang der Liste. Wenn ich neue Nodes anfüge, zähle ich deren Anzahl mit. Bei jeder geraden Anzahl steppe ich vom Anfang der Liste um 1 Node weiter und habe so immer einen Zeiger auf die Mitte der Liste, von der ich ausgehen kann! Für die weiteren Schritte würde ich weitere Zeiger benötigen, oder so wie oben weiter machen. Wenn ich weitere Zeiger will, müsste ich bei jedem zweiten weitergehen des aktuellen Mitte-Zeigers zwei neue Zeiger merken, nämlich auf eine Node vorher und eine Node nacher. Diese Zeiger müsste ich alle immer weiter anpassen. Hmmm, ich denke, das ist blöd. Bis auf den ersten Schritt, wo ich die Mitte ALLER Nodes merke. Der bringt mir evtl schonmal eine Beschleunigung um die Hälfte, ohne im ersten Schritt bis zur Hälfte zu steppen. Stimmts?
--
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 - ]

05.01.2012, 19:51 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von AGSzabo:
Ah ja, so ginge das. Ich müsste bei jedem Einfügen alle Nodes bis zum ersten Pivot durch steppen (Anzahl / 2), diesen vergleichen und dann von dort aus zB die eben Ermittelte Zahl wieder durch zweit teilen und vorwärts oder rückwärts so viele Nodes durch gehen.

Genau das schrieb ich bereits vor ein paar Stunden. Die Gesamtanzahl an vor/zurück Schritten ist (ungefähr) gleich der Anzahl Knoten.
Zitat:
Dort wieder vergleichen und so weiter, bis 0 raus kommt, oder 1?
Für Deinen Zweck läuft es so ab:
1. Du hast einen Anfang (erster Knoten) und ein Ende (letzter Knoten).
2. Du besorgst Dir den mittleren Knoten zwischen diesen beiden (Pivot)
3. Du vergleichst Deinen neuen Knoten mit dem Pivot
4. Ist der neue Knoten kleiner, ersetzt der Pivot Deinen Endknoten, ist er größer, ersetzt er Deinen Anfangsknoten. Gleichheit kann bei Dir nicht auftreten
5. Befinden sich zwischen Anfangs- und Endknoten noch andere Knoten, gehe zu Schritt 2.
6. Jetzt fügst Du den neuen Knoten zwischen A und E ein
fertig
Zitat:
Ich denke aber über eine noch weitere Beschleunigung nach:

Ich merke mir den Anfang der Liste. Wenn ich neue Nodes anfüge, zähle ich deren Anzahl mit. Bei jeder geraden Anzahl steppe ich vom Anfang der Liste um 1 Node weiter und habe so immer einen Zeiger auf die Mitte der Liste, von der ich ausgehen kann!

Das würde die Anzahl der Schritte während des Suchens halbieren.
Zitat:
Für die weiteren Schritte würde ich weitere Zeiger benötigen, oder so wie oben weiter machen. Wenn ich weitere Zeiger will, müsste ich bei jedem zweiten weitergehen des aktuellen Mitte-Zeigers zwei neue Zeiger merken, nämlich auf eine Node vorher und eine Node nacher. Diese Zeiger müsste ich alle immer weiter anpassen.
Und natürlich auch in irgendeiner Datenstruktur merken. 2*log₂(n) Knoten.
Zitat:
Hmmm, ich denke, das ist blöd. Bis auf den ersten Schritt, wo ich die Mitte ALLER Nodes merke. Der bringt mir evtl schonmal eine Beschleunigung um die Hälfte, ohne im ersten Schritt bis zur Hälfte zu steppen. Stimmts?
Ja, was das reine Steppen angeht. Der eigentliche Performance-Killer und auch der Grund, überhaupt binäre Suche anzuwenden, sind die String-Vergleiche.

Die kann man weiter reduzieren, wenn man, wie hier schon angesprochen, Interpolationssuche verwendet. Die Verfahren sind sich allerdings so ähnlich, dass es durchaus sinnvoll ist, zuerst die Binäre Suche zu implementieren.

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

05.01.2012, 20:08 Uhr

AGSzabo
Posts: 1663
Nutzer
@Holger:

Danke.

> Gleichheit kann bei Dir nicht auftreten

Doch, die AddSorted Methode ist Teil der Listview, die von der Filerequesterklasse lediglich benutzt wird. Aus der Sicht der Listview kann es durchaus zwei oder mehr gleiche Knoten geben. In dem Fall hänge ich die neue Node einfach vor (oder nach?) dem Element ein, an dem die Gleichheit festgestellt wurde?

--
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 - ]

05.01.2012, 20:14 Uhr

AGSzabo
Posts: 1663
Nutzer
@Holger:

> 2. Du besorgst Dir den mittleren Knoten zwischen diesen beiden (Pivot)

Hmm, dazu muss ich die Zahl der Nodes dazwischen wissen. Reicht es, wenn ich die beim Adden neuer Nodes 1 dazu zähle und die Zahl bei den Durchläufen jedesmal halbiere, zB mit lsr.l d0 ? Oder kommt es zu Ungenauigkeiten?
--
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 - ]

05.01.2012, 20:27 Uhr

AGSzabo
Posts: 1663
Nutzer
@Holger:

1. Ich habe einen Anfangsknoten (im ersten Schritt die Erste Node der Liste) und eine Anzahl. Einen Endknoten brauche ich nicht.

2. Ich halbiere die Anzahl. Ist sie 0, gehe ich zu Schritt 4. Sonst gehe vom Anfangsknoten so viele Nodes vorwärts wie die Anzahl ist. Die neue Node vergleiche ich mit dem Ziel.

3. Ist die neue Node kleiner, bleibt der Anfangsknoten der selbe. Ist sie größer, wird der Pivot der neue Anfangsknoten. In beiden Fällen gehe ich zu Schritt 2. An sonsten gehe ich zu 4.

4. Ich füge die Node ein.

--
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 - ]

05.01.2012, 21:38 Uhr

Thore
Posts: 2266
Nutzer
Ok, wenn dein Pivot sich ändert, bleibt die Anhahl dennoch gleich? Das wäre nämlich richtig dann. Bei jedem Mal halbiert sich die Anzahl, ungeachtet dessen wo dein Pivot ist.
Probiers aus, scheint klappen zu können.

[ - Antworten - Zitieren - Direktlink - ]

05.01.2012, 21:57 Uhr

AGSzabo
Posts: 1663
Nutzer
@Thore:

Bleibt nicht gleich. Wie meinst du das? VOR Jeder Suche nach dem neuen Pivot halbiert sich die Anzahl.
--
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 - ]

05.01.2012, 22:17 Uhr

Thore
Posts: 2266
Nutzer
Mach einfach ein paar Schreibtischtests, dann siehst du was ich meine
Also ne Menge: 1 2 3 4 5 6 7 8 9 10
dann wahlweise diese Zahlen suchen: 2, 5, 8, 9, 10
Klappt alles mit deinem Algo?
Einfach von Hand mal nachempfinden mit Papier und Stift.

[ - Antworten - Zitieren - Direktlink - ]

05.01.2012, 22:46 Uhr

AGSzabo
Posts: 1663
Nutzer
Ich seh grad mein Ansatz funktioniert so noch nicht richtig. Ich denke mir das mal auf Papier durch und melde mich dann wieder.


--
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 - ]

06.01.2012, 13:51 Uhr

AGSzabo
Posts: 1663
Nutzer
Jetzt habe ich folgenden Code, der FAST funktioniert. Ich erhalte eine im Grunde geordnete Liste, in der ein paar wenige falsch positionierte Nodes drin sind. Sieht jemand den Fehler?

code:
.binary_add	; a0 list
		; a1 new node
		; a2 noder after which to add

		; d4 new node priority
		; a4 new node text

		pushm	a0/a1	

		sub.l	a2,a2	; initially add at head

		; get number of rows, add at head if none

		move.w	oxLV_rowscount(a3),d5
		beq	.before

.start		; get back list pointer

		move.l	(a7),a5

		; get first node

		move.l	(a5),a5

.half		lsr.w	#1,d5
		beq	.add_where

		; find pivot, num is at least 1

		move.w	d5,d0
		subq.w	#1,d0

.findpivot	move.l	(a5),a5
		dbf	d0,.findpivot

		cmp.l	my_priority(a5),d4

		blt	.right
		bgt	.left

		move.l	my_text(a5),a0

		move.l	a4,a1
		bsr	.strcmp
		blt	.right
		bgt	.left

		; strings are equal here

		bra	.after

.right		move.l	a5,a2
		bra	.half

.left		move.l	a2,a5

		cmp.l	#0,a5
		beq	.start

		bra	.half

.add_where	; get node priority, higher means add before

		cmp.l	my_priority(a5),d4
		blt	.after
		bgt	.before

		move.l	my_text(a5),a0

		move.l	a4,a1
		bsr	.strcmp
		blt	.after
		bgt	.before

		; strings are equal here


.after		move.l	a5,a2

.before		popm	a0/a1
		jmp	_LVOoxAddMemberAfter(a6)


.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


--
Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system.

[ Dieser Beitrag wurde von AGSzabo am 06.01.2012 um 13:52 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

06.01.2012, 13:58 Uhr

Thore
Posts: 2266
Nutzer
Kannst Du nicht schauen, welche Nodes falsch sind und wie sie positioniert sind? Sind sie komplett anders, also "Test" zwischen "Abc" und "Bde" oder unterscheiden die sich an der 12. Stelle?
Kannst Du das Problem mit wenigen dateien analysieren?

[ - Antworten - Zitieren - Direktlink - ]

06.01.2012, 14:05 Uhr

AGSzabo
Posts: 1663
Nutzer
@Thore:

Etwa 10 aus 80 Nodes sind komplett anders positioniert.
--
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 - ]

06.01.2012, 14:11 Uhr

Thore
Posts: 2266
Nutzer
ich nehm an da funktioniert der such-Algo noch nicht richtig.
Erste Vermutung: Wenn das Pivot erst rechts, dann links wandert, oder andersrum, stimmt was nicht mehr? (ungeprüft und nur eine Vermutung)

[ - Antworten - Zitieren - Direktlink - ]

06.01.2012, 14:16 Uhr

AGSzabo
Posts: 1663
Nutzer
@Thore:

Test hat ergeben, dass der Code zwischen .add_where und .before GARNICHTS bewirkt.
--
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 - ]

06.01.2012, 14:25 Uhr

Thore
Posts: 2266
Nutzer
Geht das nicht daß man das blt .after einfach weglässt? Dann sparst ein Sprung....

[ - Antworten - Zitieren - Direktlink - ]

06.01.2012, 14:27 Uhr

AGSzabo
Posts: 1663
Nutzer
@Thore:

Das bleibt drin weil darunter noch der Fall abgehandelt werden soll,falls beide Strings gleich sind... an sonsten kann man es weglassen, ja.
--
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 - ]

06.01.2012, 14:30 Uhr

Thore
Posts: 2266
Nutzer
Im String Compare verwendest du auch d0 und d1, genau wie oben beim Pivot- Solltest du im Compare nicht die Register retten?

[ - Antworten - Zitieren - Direktlink - ]

06.01.2012, 15:01 Uhr

AGSzabo
Posts: 1663
Nutzer
@Thore:

Der immer zu halbierende Wert sitzt in d5, d0 ist bloß eine lokale Kopie davon für die Schleife.
--
Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system.

[ Dieser Beitrag wurde von AGSzabo am 06.01.2012 um 15:01 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

06.01.2012, 20:26 Uhr

AGSzabo
Posts: 1663
Nutzer
Ich habs! Mein Algo funktionierte schon im Grunde! Es musste noch ne Art Rundung mit rein und das ich mir beim vor-zurück gehen die richtige Node raus hole. Man musste mal hier mal da eine Node vorher oder nacher nehmen.

Optimieren kann man bestimmt diese Rundung:

code:
.half		ext.l	d5

		divu.w	#2,d5

		tst.w	d5
		beq	.add_where

		move.l	d5,d0
		swap	d0
		tst.w	d0
		beq	.a

		addq.w	#1,d5
.a


Bitte nicht wundern dass ich das so umständlich mache. Ich hatte zuerst nur ein "lsr.w #1,d5" drin. damit ging es aber nicht. Als Optimierung dachte ich mir, dass man das rechts evtl. raus geschobene ungerade Bit abfragen und/oder benutzen kann. Vielleicht kann jemand das ausschreiben oder hat eine bessere Idee?
--
Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system.

[ Dieser Beitrag wurde von AGSzabo am 06.01.2012 um 20:36 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

06.01.2012, 20:45 Uhr

AGSzabo
Posts: 1663
Nutzer
Mein Algo ist folgender:

Hier ist der Algo im Prinzip erklärt:

1. Ich habe die Anzahl und den Anfang. Ist die Anzahl 0, füge ich die neue Node ein.

2. Ich halbiere die Anzahl. Und addiere Sie zum Anfang um den Pivot zu erhalten. An der resultierenden Stelle vergleiche ich die Nodes.

3. War die Anzahl nach der Halbierung 0, füge ich die neue Node je nach dem Vergleich vor oder hinter der Node an der resultierten Stelle ein.

4. War die Anzahl nicht 0 und die neue Node kleiner, gehe ich zu Schritt zwei. War die Anzahl nicht 0 und die neue Node größer, wird der Pivot mein neuer Anfang und ich gehe zu Schritt 2.

Das ist sicher durch ein paar Umstellungen noch optimierbar, oder?
--
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 - ]

07.01.2012, 09:48 Uhr

AGSzabo
Posts: 1663
Nutzer
Haha, die Lösung ist mir im Halbschlaf eingefallen:

code:
.half		lsr.w	#1,d5
		beq	.add_where
		bcc	.find_pivot

		addq.w	#1,d5

.find_pivot


Das ist eine mögliche Optimierung!
--
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 - ]

07.01.2012, 10:37 Uhr

AGSzabo
Posts: 1663
Nutzer
Jetzt aber zu der eigentlichen AddSorted Routine. Ist das noch optimierbar? Vor allem dass an zwei Stellen .cmpnodes aufgerufen wird, gefällt mir nicht wirklich. Es wird aber nix doppelt ausgeführt, oder? Das .add_where kommt nur am Schluss dran.

code:
add_sorted	; a0 list
		; a1 new node

		; a4 new node text (used in .cmpnodes)
		; d4 new node priority (used in .cmpnodes)

		; d5 number of nodes in list

		pushm	a0/a1

		; a2 is the node after which the new node is added,
		; if it remains 0 the new node is added at list head

		sub.l	a2,a2

.start		; get back pointer to list 

		move.l	(a7),a5

.half		lsr.w	#1,d5
		beq	.add_where
		bcc	.find_pivot

		addq.w	#1,d5

.find_pivot	move.w	d5,d0
		subq.w	#1,d0

.loop		; get first or next node

		move.l	(a5),a5
		dbf	d0,.loop

		bsr	.cmpnodes
		beq	.add
		bgt	.left

		; right (ble)

		move.l	a5,a2

		bra	.half

.left		move.l	a2,a5

		move.l	a5,d0 ; scratch to test for 0
		beq	.start

		bra	.half

.add_where	move.l	(a5),a5

		bsr	.cmpnodes
		bgt	.add	; before

		; after (ble)

		move.l	a5,a2

.add		popm	a0/a1
		jmp	_LVOoxAddMemberAfter(a6)


Die Subroutine .cmpnodes hatten wir schon besprochen, das ist die mit den Strings.

--
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 -2- 3 [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Wieviele Files in Dir? [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.