My ACCU 2016 keynote video available online
Jens Müller via Digitalmars-d-announce
digitalmars-d-announce at puremagic.com
Thu May 19 15:50:56 PDT 2016
On Thursday, 19 May 2016 at 22:02:53 UTC, Andrei Alexandrescu
wrote:
> On 05/19/2016 05:36 PM, Jens Müller wrote:
>> I'm not seeing it. Let me explain.
>> Consider the input a = [1] and b = [2, 3] (I only write the
>> indices).
>> The smallest back index is 1, i.e., a.back is the chosen
>> sentinel.
>
> Nonono, you stamp the largest index over the smaller index. So
> you overwrite a = [3] and you leave b = [2, 3] as it is.
>
> Now you know that you're multiplying two correct sparse vectors
> in which _definitely_ the last elements have equal indexes. So
> the inner loop is:
>
> if (a[i].idx < b[j].idx) {
> i++; // no check needed
> } else if (a[i].idx > b[j].idx) {
> j++; // no check needed
> } else {
> // check needed
> r += a[i].val * b[j].val;
> if (i == imax || j == jmax) break;
> ++i;
> ++j;
> }
>
> At the end you need a fixup to make sure you account for the
> last index that you overwrote (which of course you need to save
> first).
>
> Makes sense?
What if you stomped over an index in a that has as an equal index
in b (it could be anywhere in b). After the loop finishes you
restore the index in a. But how do you address the values for the
stomped over index if needed?
For instance test it on
a = [2]
b = [2,3]
Note the 2 in b could be anywhere.
I think you can check for
if (a[i].idx == sentinelIdx) break;
instead of
if (i == imax || j == jmax) break;
Jens
More information about the Digitalmars-d-announce
mailing list