Karim Belabas on Wed, 21 Feb 2018 07:38:23 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: vecsort() and sign() |
* Karim Belabas [2018-02-20 22:18]: > * Bill Allombert [2018-02-20 14:59]: >> On Tue, Feb 20, 2018 at 11:27:12AM +0100, Karim Belabas wrote: >> We could also allow cmpf to be a closure with arity 1 and then use >> (x,y)->cmp(cmpf(x),cmpf(y)) as a comparaison function. > > Nice idea. But the documentation gives an example which explains > why a naive implementation of this is a bad idea (n log(n) calls to cmpf > instead of n). > > In this case, it is better to do something like > > T = [cmpf(x) | x<-v]; > perm = vecsort(T,,1); \\ indirect sort > vecextract(v, perm) > > We can do that internally, of course. I have a quick & dirty > implementation for this. Now cleanup up and committed to master ! Cheers, K.B. P.S. > Unfortunately, the idea breaks down with vecsearch(), which is a most > important application of vecsort() [ for repeated searches in a sorted > vector ]: [...] > Still wondering whether there's a simple solution... I ended up documenting the more efficient (but cumbersome) solution. Of course it's no worse than the current situation. If speed is critical, using a non-trivial "comparison function" in vecsearch is never a good idea. -- Karim Belabas, IMB (UMR 5251) Tel: (+33) (0)5 40 00 26 17 Universite de Bordeaux Fax: (+33) (0)5 40 00 21 23 351, cours de la Liberation http://www.math.u-bordeaux.fr/~kbelabas/ F-33405 Talence (France) http://pari.math.u-bordeaux.fr/ [PARI/GP] `