We develop a new technique for proving cell-probe lower bounds for static data structures. Previous lower bounds used a reduction to communication games, which was known not to be tight by counting arguments. We give the first lower bound for an explicit problem which breaks this communication complexity barrier. In addition, our bounds give the first separation between polynomial and near linear space. Such a separation is inherently impossible by communication complexity.Using our lower bound technique and new upper bound constructions, we obtain tight bounds for searching predecessors among a static set of integers. Given a set Y of n integers of bits each, the goal is to efficiently find predecessor(x) = max {y ∈ Y | y ≤ x}. For this purpose, we represent Y on a RAM with word length b using S ≥ n bits of space. Defining a = lg S n , we show that the optimal search time is, up to constant factors: min log b n lg −lg n a lg a lg " a lg n · lg a " lg a lg " lg a / lg lg n a «In external memory (b > ), it follows that the optimal strategy is to use either standard B-trees, or a RAM algorithm ignoring the larger block size. In the important case of b = = γ lg n, for γ > 1 (i.e. polynomial universes), and near linear space (such as S = n · lg O(1) n), the optimal search time is Θ(lg ). Thus, our lower bound implies the surprising conclusion that van Emde Boas' classic data structure from [FOCS'75] is optimal in this case. Note that for space n 1+ε , a running time of O(lg / lg lg ) was given by Beame and Fich [STOC'99].