[DGD] Multi-level map shifter bigmap
Noah Gibbs
noah_gibbs at yahoo.com
Sat Jun 7 02:04:00 CEST 2008
On the face of it, this design sounds good. I suspect you can get into situations with strongly unbalanced lists (very deep list compared to total number of nodes) by inserting in very specific orders, but most balanced-tree schemes have this property. Overall, this sounds like a good solid data structure design, and like it would have good average-case/amortized performance in most situations.
--- On Fri, 6/6/08, Shentino <shentino at gmail.com> wrote:
> From: Shentino <shentino at gmail.com>
> Subject: Re: [DGD] Multi-level map shifter bigmap
> To: noah_gibbs at yahoo.com, "All about Dworkin's Game Driver" <dgd at dworkin.nl>
> Date: Friday, June 6, 2008, 3:52 PM
> Well, here's how it works:
>
> split:
>
> When a node, at any level, gets too big, I split it in two
> by
> appending a new node linked list style and with the same
> parent, and
> then transfer half of the fat node's keyspace to the
> new node.
>
> Then, since the parent just got fatter, I repeat the
> balance check on it.
>
> merge:
>
> If a node gets too small, and it's not the root node, I
> combine it
> with one of its neighbors. Since the parent of the node
> that was
> absorbed got thinner, I repeat teh check on it.
>
> If the root node gets too fat, I "nest" by
> creating a new root node
> before splitting the old fat one.
>
> If the root node has its two children merged down to one, I
> "denest"
> by moving the only child back into root position.
>
> Invariants:
>
> All siblings are arranged in a prev<-this->next
> linked list, at various levels
> All siblings have the same level
> The keyspace of a node is a subset of the keyspace range of
> a supernode.
> The root is a single node and encompasses all.
>
> That's how I balance.
>
> I was able to get it working quite well...once...but then I
> managed to
> screw something up while I was adding iterator capability
> :P.
>
>
> On 6/6/08, Noah Gibbs <noah_gibbs at yahoo.com> wrote:
> > This kind of thing can definitely work well. What
> you're doing here has a lot in common with, for
> instance, balanced tree data structures like red-black
> trees or splay trees. You're just changing it around
> noticeably because DGD has somewhat different performance
> characteristics (specifically in terms of memory allocation
> and interpreted code) than the environments of origin of
> those data structures. Though an adaptation of any of them
> might work well for what you're doing.
> >
> > You could also look into balanced heaps, Fibonacci
> heaps and skip lists, all of what *also* solve similar
> problems. Which is best under DGD depends on a lot of
> performance information I don't know offhand, and how
> you adapt your implementation to DGD's slightly variant
> code and memory-allocation speeds. However, basing your
> data structure on one of these existing ones might help you
> be sure that your basic design is correct. What you
> describe sounds like it could be done well, but you
> haven't really given us enough information about how
> you accumulate and split chunks, and that's where all
> the magic happens. Fibonacci heaps, for instance, are made
> or broken by whether they get that part right. Splay trees
> are defined by their approach to it. Your own approach
> will be good or bad depending on how you do it.
> >
> > --- On Fri, 6/6/08, Shentino
> <shentino at gmail.com> wrote:
> >
> > > From: Shentino <shentino at gmail.com>
> > > Subject: [DGD] Multi-level map shifter bigmap
> > > To: "All about Dworkin's Game
> Driver" <dgd at dworkin.nl>
> > > Date: Friday, June 6, 2008, 2:07 PM
> > > I've recently been working on what I hope to
> be the be
> > > all and end all
> > > of types, the bigmap.
> > >
> > > Homebrew, it's structured as a successively
> layered
> > > partitioned
> > > keyspace with balancing.
> > >
> > > The bottom nodes contain the actual mapping(s)
> with the
> > > keys->values,
> > > while higher level nodes use similiar mappings to
> index
> > > their
> > > subnodes.
> > >
> > > On insertion or deletion, after I put the keys in
> or out of
> > > the
> > > bottom, I run up to do a balance check to move
> nodes back
> > > and forth as
> > > needed by splits and merges.
> > >
> > > I guess you could call it a layered linked list
> with a top
> > > level all
> > > encompassing root directory.
> > >
> > > Does anyone have any ideas or notice any
> weaknesses in this
> > > scheme?
> > >
> > > Two problems I seem to be having
> > >
> > > 1. Merges and splits require range operations on
> mappings,
> > > and
> > > massive slowdowns. Anything besides tuning to
> balance out
> > > layer count
> > > vs driver-side O(1) operations?
> > >
> > > 2. It keeps crashing...invariant violations
> aplenty
> > > everytime I run
> > > node->fsck() ;). Anything wrong with the
> design itself
> > > or am I just a
> > > sloppy coder?
> > > ___________________________________________
> > > https://mail.dworkin.nl/mailman/listinfo/dgd
> >
> >
> >
> > ___________________________________________
> > https://mail.dworkin.nl/mailman/listinfo/dgd
> >
> ___________________________________________
> https://mail.dworkin.nl/mailman/listinfo/dgd
More information about the DGD
mailing list