Que tal usar Bitmaps para gravar, para cada possível
nbr
, se esse valor é usado ou não? Para registrar que um valor foi obtido, use
SETBIT
:SETBIT key [nbr] 1
Para encontrar um
nbr
gratuito use BITPOS
:BITPOS key 0
Para evitar condições de corrida, você deve certificar-se de que seu get-and-set seja atômico. [O OP aborda isso em uma pergunta de acompanhamento.]
Isso exigirá muito pouca memória (8K bytes para 65.536 valores possíveis).
BITPOS
é O(n), mas é improvável que seja um problema real.