My ACCU 2016 keynote video available online

Andrei Alexandrescu via Digitalmars-d-announce digitalmars-d-announce at puremagic.com
Fri May 20 07:14:18 PDT 2016


On 05/19/2016 06:50 PM, Jens Müller wrote:
> What if you stomped over an index in a that has as an equal index in b
> (it could be anywhere in b).

Hmmm, you're right. So that doesn't work, or at least not efficiently 
(the fixup would entail a binary search in b).

How about this idea: arrange things such that a.back.idx <= b.back.idx 
(i.e. swap them if not so). Then stomp b.back.idx with size_t.max. Your 
kernel is:

if (a[i].idx < b[j].idx) {
   if (i == imax) break; // check needed
   i++;
} else if (a[i].idx > b[j].idx) {
   j++; // no check needed
} else {
   // no check needed
   r += a[i++].val * b[j++].val;
}

The fixup needs only to account for the case a.back.idx == b.back.idx. 
In fact I like this a lot better than others because it works real fast 
for identical vector (taking the norm) or similar vectors (often the 
case). Works?


Andrei



More information about the Digitalmars-d-announce mailing list