On Friday, 15 November 2013 at 19:21:35 UTC, H. S. Teoh wrote:
On Fri, Nov 15, 2013 at 10:52:15PM +0400, Dmitry Olshansky wrote:
15-Nov-2013 22:41, H. S. Teoh пишет:
>This isn't directly related to D (though the code will be in >D), and
>I thought this would be a good place to ask.
>
>I'm trying to implement an algorithm that traverses a very >large >graph, and I need some kind of data structure to keep track >of which >nodes have been visited, that (1) allows reasonably fast >lookups
>(preferably O(1)),

Store as a bit-flag in whatever structure that serves as node. It's going to be the fastest anyway and you indeed get to use only 1 bit per node (and given padding and whatnot you may already have a couple
of bytes to spare per node).
[...]

There are too many nodes to keep in memory, actually. The algorithm also doesn't need to store the nodes; it can easily generate them on-the-fly when it needs them. The challenge is when it needs to know whether a particular generated node has been visited before. I'd like to be able to have a fast lookup (hopefully O(1)) that tells me whether node X has been seen before. The problem is, there may have been a very large number of previously-seen nodes, so I need some way of storing this
information in a space-efficient way.

I'm hoping for a kind of compressed representation where multiple adjacent nodes can be represented in a very compact way, by somehow taking advantage of the fact that they lie on an n-dimensional grid and the fact that graph edges are always a subset of grid edges (as opposed
to edges between two arbitrary nodes).

A Trie might be an idea, especially the bitwise variant.

http://en.wikipedia.org/wiki/Trie

Reply via email to