Bizonyára van jobb algoritmus, nem kétlem.
Ugyanakkor nem látom át, hogy EZT a kódot hogyan lehetne
LÉNYEGESEN gyorsítani. A futásidő döntő többségét a két ciklus
viszi el: RS_permutation() és az IsItDancingQueen(), kb fele-fele
arányban osztozva az időn. Mindkettő számtani haladvány
szerint hosszabbodik, illetve az egész faktoriálisan függ
a NUMBER_OF_QUEENS-től (ez a faktoriális növekedés nagyon szépen
látszik is az általam közölt futásidőkön).
Az RS_permutation()-ban vizsgálni lehetne, hogy nem rekurzíve szervezve
a stack műveletek elhagyásával, ugyanakkor más műveleti költségek
megjelenésével lehet-e időt fogni, gyanítom, hogy nem. Az időt
általában az összehasonlító műveletek viszik viszik el, a stack műveletek
gyorsak. Az eljárás a ciklusszervező utasításokon és a rekurzív híváson
kívül csak egy swap-ot tartalmaz, assemblyben lehetne ezt is
stackon keresztül csinálni így:
push a
push b
pop a
pop b
Ez biztos, hogy gyorsabb az egyszerű értékadásnál, főleg, ha a-t és b-t
regiszterben tartod.
Az IsItDancingQueen() szerintem semmit olyat nem tartalmaz, ami felesleges,
talán a két értékadás lenne elhagyható, ha magát a műveletet az abs() fv-nek
adjuk át.
Kiváncsian várom ugyanakkor a véleményed, Te mit látsz másként.
> Sol omnibus lucet.