day 20 WAVL implementation completed, but slow
commit3ad009ae85b47fe1231111610a8c127f2cd73039
authorEric Blake <eblake@redhat.com>
Tue, 24 Jan 2023 01:20:41 +0000 (23 19:20 -0600)
committerEric Blake <eblake@redhat.com>
Tue, 24 Jan 2023 01:37:12 +0000 (23 19:37 -0600)
tree487809c3d2e21987369ba231732b3be6a8ad0872
parente9560e1e9f1ff460e704ac840fef5ab07cc759da
day 20 WAVL implementation completed, but slow

Without a hack, at 3 iterations, -Dscan=sqrt completes in 3.8s,
-Dscan=log completes in 6.8s and gives the same answer.  At 4
iterations, -Dscan=log fails with a duplicate key; insertions are
attempted at the same index more than 15 times, which runs out of bits
on my idea of picking a key by averaging neighboring values.  With the
hack of an O(n) rekey pass between each mix, the full solution works,
but 11.0s for -Dscan=sqrt vs. 18.8s for -Dscan=log says that even
though the algoithm scales better, it has a lot more overhead.

Maybe it's possible to implement without any keying: instead of
inserting by key, insert solely by position.  It probably still won't
beat -Dscan=sqrt, but at least wouldn't be so hacky.  At which point,
a skip list may fit better than WAVL.
2022/day20.m4