Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 13-03-2004, 09:43   #1 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
Question Array.insert(array) ??

Hallo,

ich muss an einer Bestimmten Stelle in ein Array ein anderes Array einfügen. Da ich das ziemlich, bzw. sehr oft mahcen muss, brauche ich dazu eine möglichst schnelle Variante.
Leider komme ich nicht auf was schnelles, hier meine bisherige Version:

ActionScript:
  1. Array.prototype.insert = function(index,elements)
  2. {
  3.     var temp0 = this.slice(0,index);
  4.     var temp1 = this.slice(index);
  5.     return temp0.concat(elements,temp1);
  6. }

diese Funktion ist viel zu langsam, braucht bei mir bei sowas:

ActionScript:
  1. arr = new Array(1,2,3,7,8,9);
  2. ins = new Array(4,5,6);
  3. arr = arr.insert(3,ins);

ca. 5ms.

Hat jemand vielleicht einen besseren Ansatz?

Geändert von Janoscharlipp (13-03-2004 um 09:54 Uhr)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 13-03-2004, 10:12   #2 (permalink)
God made me funky..
 
Registriert seit: Apr 2003
Ort: Bremen
Beiträge: 1.067
Müsste eigentlich etwas schneller sein:

ActionScript:
  1. Array.prototype.insert = function( index, elements ){
  2.         var r = this.slice( index );
  3.         this.length = index;
  4.         return this.concat( elements, r );
  5. }

Ansonsten vielleicht die Datenstruktur nochmal überdenken.
__________________
Kunst ist in erster Linie eine Frage der Form und nicht des Inhalts
Paul Rand
e2e4 ist offline   Mit Zitat antworten
Alt 13-03-2004, 10:49   #3 (permalink)
querdenker
 
Benutzerbild von kelor
 
Registriert seit: Jun 2001
Ort: formel1-stadt hockenheim
Beiträge: 4.731
sagt mal.... hab ich was nicht verstanden?

wie wäre es mit nem simplen 'splice', der ist viel schneller als concat und konsorten.

ActionScript:
  1. Array.prototype.insert = function(index,elements){
  2.         var i=0;
  3.         while(i++ <elements.length) this.splice(index+(i-1),0,elements[i-1]);
  4.         return this;
  5. }
  6.  
  7.  
  8. arr = [1,2,3,7,8,9];
  9. ins = [4,5,6];
  10. arr.insert(stelle,ins);

greetz

kelor
kelor ist offline   Mit Zitat antworten
Alt 13-03-2004, 11:14   #4 (permalink)
God made me funky..
 
Registriert seit: Apr 2003
Ort: Bremen
Beiträge: 1.067
Das is ja nun noch langsamer, wobei ich jetzt beim Testen festgestellt hab, das meine Variante auch nicht schneller als Janos ist. Sie ist im Gegenteil noch einen Tick langsamer....
__________________
Kunst ist in erster Linie eine Frage der Form und nicht des Inhalts
Paul Rand
e2e4 ist offline   Mit Zitat antworten
Alt 13-03-2004, 11:38   #5 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
vielen Dank.
Da also nichts, oder nicht mehr viel rauszuholen ist, muss ich mir das anders ausdenken.
Wie würdet ihr das denn machen:
Ich hab ne Funtion, der gebe ich in einem Array zwei Punkte:
ActionScript:
  1. startPoint = {x:100,y:100};
  2. endPoint = {x:300,y:300};
  3. way = getWay([startPoint,endPoint]);

diese Funktion soll jetzt prüfen ob der Weg von p1 zu p2 frei ist, wenn ja, einfach wieder die Punkte zurück geben, wenn nicht, einen Umgehungspunkt finden, und rekursiv mit dem neuen Wegpunkt zwei mal sich selbst aufrufen. Also in Pseudocode sowas:

ActionScript:
  1. getWay = function(p1,p2)
  2. {
  3. var way = [p1,p2]; 
  4. if(freeWay(p1,p2))
  5. {
  6. return way
  7. }
  8. else
  9. {
  10. var p3 = getNewPoint(p1,p2);
  11. newWay1 = getWay(p1,p3);
  12. newWay2 = getWay(p3,p2);
  13.  
  14. return newWay1.concat(newWay2);
  15. }

(nicht so genau nehmen... nur im Prinzip )

Sollte ich da immer das Weg-Array als Referenz weitergeben, und jede neue Funktion bastelt daran rum, oder sollte jede Funktion ihr Ergebnis returnen und die parent-Funktion setzt dann das Ergebnis in ihr Array ein, und returnt das, bis dann shcließlich der finale Weg rauskommt?
Janoscharlipp ist offline   Mit Zitat antworten
Alt 13-03-2004, 11:40   #6 (permalink)
querdenker
 
Benutzerbild von kelor
 
Registriert seit: Jun 2001
Ort: formel1-stadt hockenheim
Beiträge: 4.731
Zitat:
Das is ja nun noch langsamer


wieso ist die langsamer?

beweisführung?!


greetz

kelor
kelor ist offline   Mit Zitat antworten
Alt 13-03-2004, 11:41   #7 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
hier noch ein kleiner Array.insert prototyp, leider der langsamste

ActionScript:
  1. Array.prototype.insert = function(index,elements)
  2. {
  3.     elements.unshift(0);
  4.     elements.unshift(index);
  5.     this.splice.apply(this,elements);
  6. return this;
  7. }
Janoscharlipp ist offline   Mit Zitat antworten
Alt 13-03-2004, 11:43   #8 (permalink)
querdenker
 
Benutzerbild von kelor
 
Registriert seit: Jun 2001
Ort: formel1-stadt hockenheim
Beiträge: 4.731
wie errechnest du bzw willst du errechnenn einen neuen punkt, janosch...?


schon ein script / eine funktion?



greetz

kelor
kelor ist offline   Mit Zitat antworten
Alt 13-03-2004, 11:44   #9 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
@kelor
bei mir ist deine auch langsamer:

ActionScript:
  1. Array.prototype.insert = function(index,elements)
  2. {
  3.     var temp0 = this.slice(0,index);
  4.     var temp1 = this.slice(index);
  5.     return temp0.concat(elements,temp1);
  6. }
  7.  
  8. Array.prototype.insertKelor = function(index,elements){
  9.         var i=0;
  10.         while(i++ <elements.length) this.splice(index+(i-1),0,elements[i-1]);
  11. }
  12.  
  13.  
  14. t = getTimer();
  15. for(var i=0; i<cnt; i++)
  16. {
  17.     arr = new Array(1,2,3,7,8,9);
  18.     arr = arr.insert(3,ins);
  19. }
  20. trace(getTimer()-t+" : "+arr);
  21.  
  22.  
  23. t = getTimer();
  24. for(var i=0; i<cnt; i++)
  25. {
  26.     arr = new Array(1,2,3,7,8,9);
  27.     arr.insertKelor(3,ins);
  28. }
  29. trace(getTimer()-t+" : "+arr);
  30.  
  31. // Ausgabe:
  32. // 147 : 1,2,3,4,5,6,7,8,9
  33. // 316 : 1,2,3,4,5,6,7,8,9
  34.  
Janoscharlipp ist offline   Mit Zitat antworten
Alt 13-03-2004, 11:45   #10 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
keine Funktion aber eine Idee, und einen Entwurf *geheimniskram*
Janoscharlipp ist offline   Mit Zitat antworten
Alt 13-03-2004, 11:45   #11 (permalink)
God made me funky..
 
Registriert seit: Apr 2003
Ort: Bremen
Beiträge: 1.067
For all your pathfinding needs:
http://theory.stanford.edu/~amitp/GameProgramming/
__________________
Kunst ist in erster Linie eine Frage der Form und nicht des Inhalts
Paul Rand
e2e4 ist offline   Mit Zitat antworten
Alt 13-03-2004, 11:48   #12 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
thx, e2e4, aber bei mir wird das komplett anders aussehen. Ohne Grid...
Janoscharlipp ist offline   Mit Zitat antworten
Alt 13-03-2004, 11:51   #13 (permalink)
God made me funky..
 
Registriert seit: Apr 2003
Ort: Bremen
Beiträge: 1.067
Na dann:
http://216.5.163.53/DirectX4VB/Tutor...M_Dijkstra.asp
__________________
Kunst ist in erster Linie eine Frage der Form und nicht des Inhalts
Paul Rand
e2e4 ist offline   Mit Zitat antworten
Alt 13-03-2004, 11:56   #14 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
das ist schick, das werde ich mir mal durchlesen.
Allerdings möchte ich auf jeden Fall meine Idee mal ausprobieren, ich hoffe komplett ohne Wegpunkte, Nodes, Graphen und ähnlihces auszukommen.
Mir geht es jetzt mehr um die sache Referenz übergeben, oder Ergebnis returnen.
Janoscharlipp ist offline   Mit Zitat antworten
Alt 13-03-2004, 12:06   #15 (permalink)
God made me funky..
 
Registriert seit: Apr 2003
Ort: Bremen
Beiträge: 1.067
Referenz und in die immer nur die Punkte reinpushen die begehbar sind. Dann müsste das eigentlich linear von statten gehen.
__________________
Kunst ist in erster Linie eine Frage der Form und nicht des Inhalts
Paul Rand
e2e4 ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 11:03 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele