** Edit: omdat ik merk dat context wel degelijk belangrijk is, heb ik dat in mijn derde post uitgelegd ... wellicht handig als je dat eerst leest. Alvast bedankt
**
Ik ben bezig met het schrijven van een implementatie van een wiskundig algoritme. Ik heb al eerder wat vragen gesteld specifiek gerelateerd aan C++, maar dit is meer een algemene vraag. Theoretische snelheid van een algoritme is natuurlijk mooi, maar uiteindelijk is het toch de snelheid van de computerimplementatie waar het om draait. Probleem is dat ik weliswaar redelijk wat programmeerervaring heb, maar wanneer ik een op-en-top efficiente implementatie moet schrijven (nu het geval
) schiet mijn kennis gewoonweg tekort.
(Voor de mensen met wat kennis van combinatorisch optimaliseren: ik heb N cycles die ik één voor één aan elkaar wil plakken.)
Stel dat ik op een gegeven moment N vectoren heb van wisselende lengte. Van elke mogelijke combinatie van elementen uit twee verschillende vectoren heb ik een waarde berekend; deze zijn opgeslagen in drie dimensionale vector PatchCosts[I][J][K]; eerste twee indices geven de betreffende vectoren aan, K is de index. Voor twee vectoren C1 en C2 van lengte drie is de dimensie van PatchCosts dus negen. Ik houd er uiteraard rekening mee dat de waarden tussen C1 en C2 dezelfde zijn als C2 en C1 en dus niet berekend hoeven te worden, en PatchCosts is een soort bovendriehoeksmatrix (de waarden van cycles 4 en 6 staan in PatchCosts[4][1]).
Aan de hand van een bepaalde criteria, gebaseerd op deze waarden, besluit ik om één vector (C2) in een andere (C1) in te voegen. Ik kan nu natuurlijk de hele array PatchCosts opnieuw berekenen, maar dat is natuurlijk onnodig: de waarden tussen alle vectoren anders dan C1 en C2 blijven onveranderd en de waarden van vectoren gerelateerd aan C2 dienen alleen op de juiste posities ingevoegd te worden in de waarden gerelateerd aan C1. Nu heb ik een code geschreven waarbij ik gebruik maak van de container-class vector, en ik ben er ingeslaagd om het ‘updaten’ van de vector PatchCosts foutloos te laten verlopen. Hoewel deze code uiteindelijk nog geeneens 20 regels is, was dat behoorlijk complex om te maken en heeft een hóóp tijd gekost (geklooi met dimensies en posities in vectoren etc…).
Probleem: ik maak véél gebruik van het commando ‘insert’, en dat is een operatie met complexiteit N (volgens mij). Hoewel de huidige implementatie sneller is dan in het geval dat alles opnieuw berekend wordt, is het nog veel te traag. Op dit moment voeg ik elementen één voor één in; je begrijpt dat als ik een vector met dimensie 100 bij een andere vector met dimensie 150 invoeg, dat ik dus 100 keer (gemiddeld genomen) 75 elementen één positie opschuif.
Nu kan ik switchen naar een andere container-class, maar het probleem is dat de waarden PatchCosts[I][J][K] bij wijze van spreken net zo vaak opgevraagd worden in berekeningen, als dat ik inserts gebruik. Random access is dus net zo belangrijk als random insert.
Ik zou graag willen weten wat een efficientere aanpak is. Eén daarvan is de dimensie van C1 in één keer vergroten, de elementen van C1 verplaatsen naar het einde en C2 invoegen. Een andere is het één voor één schrijven van alle waarden naar een dummy vector om die vervolgens in één klap te kopieren naar PatchCosts met de juiste index. Zo zijn er vast nog wel wat alternatieven. Ik kan ze natuurlijk één voor één proberen maar zoiets implementeren vergt best veel tijd; ik hoop dat jullie hier je licht op kunnen laten schijnen.
Bedankt!
Ik ben bezig met het schrijven van een implementatie van een wiskundig algoritme. Ik heb al eerder wat vragen gesteld specifiek gerelateerd aan C++, maar dit is meer een algemene vraag. Theoretische snelheid van een algoritme is natuurlijk mooi, maar uiteindelijk is het toch de snelheid van de computerimplementatie waar het om draait. Probleem is dat ik weliswaar redelijk wat programmeerervaring heb, maar wanneer ik een op-en-top efficiente implementatie moet schrijven (nu het geval
(Voor de mensen met wat kennis van combinatorisch optimaliseren: ik heb N cycles die ik één voor één aan elkaar wil plakken.)
Stel dat ik op een gegeven moment N vectoren heb van wisselende lengte. Van elke mogelijke combinatie van elementen uit twee verschillende vectoren heb ik een waarde berekend; deze zijn opgeslagen in drie dimensionale vector PatchCosts[I][J][K]; eerste twee indices geven de betreffende vectoren aan, K is de index. Voor twee vectoren C1 en C2 van lengte drie is de dimensie van PatchCosts dus negen. Ik houd er uiteraard rekening mee dat de waarden tussen C1 en C2 dezelfde zijn als C2 en C1 en dus niet berekend hoeven te worden, en PatchCosts is een soort bovendriehoeksmatrix (de waarden van cycles 4 en 6 staan in PatchCosts[4][1]).
Aan de hand van een bepaalde criteria, gebaseerd op deze waarden, besluit ik om één vector (C2) in een andere (C1) in te voegen. Ik kan nu natuurlijk de hele array PatchCosts opnieuw berekenen, maar dat is natuurlijk onnodig: de waarden tussen alle vectoren anders dan C1 en C2 blijven onveranderd en de waarden van vectoren gerelateerd aan C2 dienen alleen op de juiste posities ingevoegd te worden in de waarden gerelateerd aan C1. Nu heb ik een code geschreven waarbij ik gebruik maak van de container-class vector, en ik ben er ingeslaagd om het ‘updaten’ van de vector PatchCosts foutloos te laten verlopen. Hoewel deze code uiteindelijk nog geeneens 20 regels is, was dat behoorlijk complex om te maken en heeft een hóóp tijd gekost (geklooi met dimensies en posities in vectoren etc…).
Probleem: ik maak véél gebruik van het commando ‘insert’, en dat is een operatie met complexiteit N (volgens mij). Hoewel de huidige implementatie sneller is dan in het geval dat alles opnieuw berekend wordt, is het nog veel te traag. Op dit moment voeg ik elementen één voor één in; je begrijpt dat als ik een vector met dimensie 100 bij een andere vector met dimensie 150 invoeg, dat ik dus 100 keer (gemiddeld genomen) 75 elementen één positie opschuif.
Nu kan ik switchen naar een andere container-class, maar het probleem is dat de waarden PatchCosts[I][J][K] bij wijze van spreken net zo vaak opgevraagd worden in berekeningen, als dat ik inserts gebruik. Random access is dus net zo belangrijk als random insert.
Ik zou graag willen weten wat een efficientere aanpak is. Eén daarvan is de dimensie van C1 in één keer vergroten, de elementen van C1 verplaatsen naar het einde en C2 invoegen. Een andere is het één voor één schrijven van alle waarden naar een dummy vector om die vervolgens in één klap te kopieren naar PatchCosts met de juiste index. Zo zijn er vast nog wel wat alternatieven. Ik kan ze natuurlijk één voor één proberen maar zoiets implementeren vergt best veel tijd; ik hoop dat jullie hier je licht op kunnen laten schijnen.
Bedankt!
[ Voor 3% gewijzigd door Knakker op 18-11-2005 12:25 ]
Geef mij maar een Warsteiner.

