Efficient binary search tree stored in a flat array?

Scott David Daniels Scott.Daniels at Acm.Org
Tue Jul 14 09:19:37 EDT 2009


Piet van Oostrum wrote:
>>>>>> Douglas Alan <darkwater42 at gmail.com> (DA) wrote:
> 
>> DA> On Jul 13, 3:57 pm, a... at pythoncraft.com (Aahz) wrote:
>>>> Still, unless your list is large (more than thousands of elements),
>>>> that's the way you should go.  See the bisect module.  Thing is, the
>>>> speed difference between C and Python means the constant for insertion
>>>> and deletion is very very small relative to bytecode speed.  Keep in
>>>> mind that Python's object/binding model means that you're shuffling
>>>> pointers in the list rather than items.
> 
>> DA> Thank you. My question wasn't intended to be Python specific, though.
>> DA> I am just curious for purely academic reasons about whether there is
>> DA> such an algorithm. All the sources I've skimmed only seem to the
>> DA> answer the question via omission. Which is kind of strange, since it
>> DA> seems to me like an obvious question to ask.

It may well be that there is no good simple solution, and people avoid
writing about non-existent algorithms.  I certainly cannot imagine
trying to write an article that carefully covered ideas which don't
have well-studied data structures available, and calling them out
only to say, "we don't know how to do this well."  If such an algorithm
were simple and obvious, I dare say you'd be taught about it around the
time you learn binary search.

> Of course you can take any BST algorithm and replace pointers by indices
> in the array and allocate new elements in the array. But then you need
> array elements to contain the indices for the children explicitely.

And you loower your locality of reference (cache-friendliness).
Note the insert in Python, for example, is quite cache-friendly.

--Scott David Daniels
Scott.Daniels at Acm.Org



More information about the Python-list mailing list