The first data structure to provide 
 time
 time 
 ,
,
 , and
, and 
 operations was proposed by van Emde Boas and
has since become known as the van Emde Boas
(or stratified)
tree [72].  The original van Emde Boas structure had size
 operations was proposed by van Emde Boas and
has since become known as the van Emde Boas
(or stratified)
tree [72].  The original van Emde Boas structure had size
 , making it impractical for large integers.
, making it impractical for large integers.
The 
 and
 and 
 data structures were discovered by
Willard [75].  The
 data structures were discovered by
Willard [75].  The 
 structure is closely related
to van Emde Boas trees;  for instance, the hash tables in an
 structure is closely related
to van Emde Boas trees;  for instance, the hash tables in an 
 replace arrays in a van Emde Boas tree.  That is, instead of storing
the hash table
replace arrays in a van Emde Boas tree.  That is, instead of storing
the hash table 
![$ \mathtt{t[i]}$](img6131.png) , a van Emde Boas tree stores an array of length
, a van Emde Boas tree stores an array of length
 .
.
Another structure for storing integers is Fredman and Willard's fusion
trees [32].
This structure can store 
 
 
 -bit integers in
-bit integers in
 space so that the
 space so that the 
 operation runs in
 operation runs in 
 time.  By using a fusion tree when
 time.  By using a fusion tree when 
 and
a
 and
a 
 when
 when 
 , one obtains an
, one obtains an 
 space data structure that can implement the
space data structure that can implement the 
 operation in
 operation in
 time.  Recent lower-bound results of P
 time.  Recent lower-bound results of P tra
tra cu
and Thorup [57] show that these results are more or less optimal,
at least for structures that use only
cu
and Thorup [57] show that these results are more or less optimal,
at least for structures that use only 
 space.
 space.
 that
  does not have a linked list or jump pointers, but for which
 that
  does not have a linked list or jump pointers, but for which 
 
still runs in 
 time.
 time.
 that doesn't use a binary trie at all. Instead, your implementation
  should store everything in a doubly-linked list and
  that doesn't use a binary trie at all. Instead, your implementation
  should store everything in a doubly-linked list and 
 hash tables.
  hash tables.
 as a structure that stores bit strings
  of length
 as a structure that stores bit strings
  of length 
 in such a way that each bitstring is represented as a
  root to leaf path.  Extend this idea into an
 in such a way that each bitstring is represented as a
  root to leaf path.  Extend this idea into an 
 implementation that
  stores variable-length strings and implements
 implementation that
  stores variable-length strings and implements 
 ,
, 
 ,
  and
,
  and 
 in time proporitional to the length of
 in time proporitional to the length of 
 .
.
Hint: Each node in your data structure should store a hash table that is indexed by character values.
 , let
, let 
 denote
  the difference between
 denote
  the difference between 
 and the value returned by
 and the value returned by 
 [if
  [if 
 returns
 returns 
 , then define
, then define 
 as
 as 
 ].
  For example, if
].
  For example, if 
 returns 43, then
 returns 43, then  .
.
  
 operation in an
      operation in an 
 that runs in
 that runs in 
 expected time. Hint: The hash table
      expected time. Hint: The hash table 
![$ t[\ensuremath{\mathtt{w}}]$](img6170.png) contains all the
      values,
 contains all the
      values, 
 , such that
, such that 
 , so that would be a good place
      to start.
, so that would be a good place
      to start.
 operation in an
      operation in an  
 that runs in
 that runs in 
 expected time.
      expected time.
  
opendatastructures.org