Wait, sparse initialization with a pass through the argument is faster than radix stuff
This commit is contained in:
parent
5cd2cab26e
commit
ad8570be11
@ -24,45 +24,13 @@ B memberOf_c1(B t, B x) {
|
||||
u##T* xp = (u##T*)i##T##any_ptr(x); \
|
||||
i8* rp; B r = m_i8arrv(&rp, n); \
|
||||
TALLOC(u8, tab, tn); \
|
||||
for (usz j=0; j<tn; j++) tab[j]=1; \
|
||||
for (usz i=0; i<n; i++) { u##T j=xp[i]; rp[i]=tab[j]; tab[j]=0; } \
|
||||
if (T>8 && n<tn/64) for (usz i=0; i<n; i++) tab[xp[i]]=1; \
|
||||
else for (usz j=0; j<tn; j++) tab[j]=1; \
|
||||
for (usz i=0; i<n; i++) { u##T j=xp[i]; rp[i]=tab[j]; tab[j]=0; } \
|
||||
decG(x); TFREE(tab); \
|
||||
return num_squeeze(r)
|
||||
if (xe==el_i8) { if (n<8) { BRUTE(8); } else { LOOKUP(8); } }
|
||||
if (xe==el_i16) {
|
||||
if (n<16) { BRUTE(16); }
|
||||
if (n>=256) { LOOKUP(16); }
|
||||
// Radix-assisted lookup
|
||||
usz rx = 256, tn = 256; // Radix; table length
|
||||
u16* v0 = (u16*)i16any_ptr(x);
|
||||
i8* r0; B r = m_i8arrv(&r0, n);
|
||||
TALLOC(u8, alloc, 4*n+(tn+rx));
|
||||
u8 *c0 = alloc;
|
||||
u8 *k0 = c0+rx;
|
||||
u16 *v1 = (u16*)(k0+n);
|
||||
u8 *r1 = (u8*)(v1+n);
|
||||
u8 *tab= r1+n;
|
||||
// Count keys
|
||||
for (usz j=0; j<rx; j++) c0[j] = 0;
|
||||
for (usz i=0; i<n; i++) c0[(u8)(v0[i]>>8)]++;
|
||||
// Exclusive prefix sum
|
||||
usz s=0; for (usz j=0; j<rx; j++) { usz p=s; s+=c0[j]; c0[j]=p; }
|
||||
// Radix move
|
||||
for (usz i=0; i<n; i++) { u16 v=v0[i]; u8 k=k0[i]=(u8)(v>>8); usz c=c0[k]++; v1[c]=v; }
|
||||
// Table lookup
|
||||
for (usz j=0; j<tn; j++) tab[j]=1;
|
||||
u8 t0=v1[0]>>8;
|
||||
for (usz i=0, e=0; i<n; i++) {
|
||||
u16 v=v1[i]; u8 tv=v>>8;
|
||||
if (tv!=t0) { for (; e<i; e++) tab[(u8)v1[e]]=1; t0=tv; }
|
||||
usz j=(u8)v; r1[i]=tab[j]; tab[j]=0;
|
||||
}
|
||||
// Radix unmove
|
||||
memmove(c0+1, c0, rx-1); c0[0]=0;
|
||||
for (usz i=0; i<n; i++) { r0[i]=r1[c0[k0[i]]++]; }
|
||||
decG(x); TFREE(alloc);
|
||||
return num_squeeze(r);
|
||||
}
|
||||
if (xe==el_i16) { if (n<8) { BRUTE(16); } else { LOOKUP(16); } }
|
||||
#undef LOOKUP
|
||||
// Radix-assisted lookup
|
||||
if (n<=32 && xe==el_i32) { BRUTE(32); }
|
||||
|
||||
Loading…
Reference in New Issue
Block a user