The code can be amazingly simple. Here's my first cut at insertion:
public void add(T x) { Object[] tmp = new Object[] { x }; int i = 0; for (; nodes[i] != null; ++i) { tmp = merge(nodes[i], tmp); nodes[i] = null; } nodes[i] = tmp; }merge simply merges two sorted arrays into a new larger array.
This works fine, but it will chew through a lot of memory allocating new arrays. The space will be reclaimed by the garbage collector, but it seems a little wasteful.
So I modified it to pre-allocate the first few levels of small arrays since these are the ones that get the heavy activity. (e.g. the first four levels of size 1, 2, 4, and 8 will handle 15/16 of adds) This complicates the code a bit, but not too badly.
Iteration is quite simple as well - just merging the sorted nodes.
The full code is in SourceForge
No comments:
Post a Comment