  A lattice is a partially-ordered set in which every pair of elements has a
unique meet (greatest lower bound) and join (least upper bound). We present new
data structures for lattices that are simple, efficient, and nearly optimal in
terms of space complexity.
  Our first data structure can answer partial order queries in constant time
and find the meet or join of two elements in $O(n^{3/4})$ time, where $n$ is
the number of elements in the lattice. It occupies $O(n^{3/2}\log n)$ bits of
space, which is only a $\Theta(\log n)$ factor from the $\Theta(n^{3/2})$-bit
lower bound for storing lattices. The preprocessing time is $O(n^2)$. This
structure admits a simple space-time tradeoff so that, for any $c \in
[\frac{1}{2}, 1]$, the data structure supports meet and join queries in
$O(n^{1-c/2})$ time, occupies $O(n^{1+c}\log n)$ bits of space, and can be
constructed in $O(n^2 + n^{1+3c/2})$ time.
  Our second data structure uses $O(n^{3/2}\log n)$ bits of space and supports
meet and join in $O(d \frac{\log n}{\log d})$ time, where $d$ is the maximum
degree of any element in the transitive reduction graph of the lattice. This
structure is much faster for lattices with low-degree elements.
  This paper also identifies an error in a long-standing solution to the
problem of representing lattices. We discuss the issue with this previous work.
