Range Binary: O Que É, Como Funciona e Por Que É Essencial no Mundo da Programação e Cripto
Se você já trabalhou com buscas binárias ou manipulação de intervalos em grandes volumes de dados, certamente ouviu falar do termo range binary. Apesar de ainda ser pouco explorado em conteúdos de língua portuguesa, essa técnica combina o poder da busca binária tradicional com a capacidade de localizar intervalos (ranges) de maneira extremamente eficiente.
1. Conceito Fundamental de Range Binary
Em termos simples, um algoritmo range binary procura encontrar não apenas um único elemento em um array ordenado, mas todos os elementos que pertencem a um intervalo específico. Por exemplo, dado um vetor ordenado de preços de criptomoedas, queremos identificar rapidamente todas as cotações que estejam entre R$ 10.000
e R$ 12.000
. A busca binária tradicional retornaria apenas um índice; o range binary retorna dois índices (início e fim) que delimitam o intervalo desejado.
2. Por Que o Range Binary É Importante no Universo Cripto?
O mercado de criptomoedas gera volumes massivos de dados em tempo real – preços, volumes, blocos, transações e muito mais. Quando desenvolvedores constroem oráculos, bridges ou smart contracts que precisam consultar faixas de preços ou períodos de tempo, a eficiência é crucial. Um algoritmo range binary permite:
- Reduzir a complexidade de
O(n)
paraO(log n)
ao buscar intervalos. - Executar consultas em tempo real em ambientes on‑chain, onde gas fees são sensíveis a loops extensos.
- Garantir determinismo nos contratos inteligentes, evitando variações inesperadas de performance.
Para entender como oráculos lidam com grandes bases de dados, veja nosso artigo Oracles em Blockchain. Ele demonstra a necessidade de buscas rápidas em datasets distribuídos.
3. Estrutura do Algoritmo Range Binary
O algoritmo pode ser dividido em duas fases:
- Busca do limite inferior (lower bound): encontra o primeiro índice cujo valor seja maior ou igual ao início do intervalo.
- Busca do limite superior (upper bound): encontra o primeiro índice cujo valor seja maior que o fim do intervalo (ou o último índice válido).
Ambas as fases utilizam a lógica clássica da busca binária, com pequenas adaptações nos critérios de comparação.

3.1 Pseudocódigo
function lowerBound(arr, target): left = 0 right = len(arr) while left < right: mid = (left + right) // 2 if arr[mid] < target: left = mid + 1 else: right = mid return left function upperBound(arr, target): left = 0 right = len(arr) while left < right: mid = (left + right) // 2 if arr[mid] <= target: left = mid + 1 else: right = mid return left function rangeBinary(arr, low, high): start = lowerBound(arr, low) end = upperBound(arr, high) return (start, end) // intervalo [start, end)
3.2 Complexidade
Cada chamada de lowerBound
ou upperBound
executa O(log n)
comparações. Portanto, o algoritmo completo tem complexidade total de O(log n), independentemente do tamanho do intervalo retornado.
4. Implementação Prática em Python
A linguagem Python oferece a biblioteca bisect
que encapsula exatamente esse comportamento. Veja um exemplo concreto aplicado ao histórico de preços de Bitcoin:
import bisect # Lista ordenada de preços (exemplo simplificado) precos = [9500, 9700, 10000, 10250, 10500, 10800, 11000, 11200, 11500] # Intervalo desejado low, high = 10000, 11200 # lower bound (primeiro >= low) start = bisect.bisect_left(precos, low) # upper bound (primeiro > high) end = bisect.bisect_right(precos, high) print(f"Indices: {start} a {end-1}") print(f"Preços no intervalo: {precos[start:end]}")
Resultado:
Indices: 2 a 7 Preços no intervalo: [10000, 10250, 10500, 10800, 11000, 11200]
5. Aplicação em Smart Contracts (Solidity)
Em contratos inteligentes, loops extensos são proibitivos. Uma implementação range binary em Solidity pode ser feita usando uint256
e while
loops que garantem O(log n)
iterações. A seguir, um snippet simplificado:
pragma solidity ^0.8.0; contract RangeBinary { uint256[] public sortedValues; constructor(uint256[] memory _values) { sortedValues = _values; } function lowerBound(uint256 target) internal view returns (uint256) { uint256 left = 0; uint256 right = sortedValues.length; while (left < right) { uint256 mid = (left + right) / 2; if (sortedValues[mid] < target) { left = mid + 1; } else { right = mid; } } return left; } function upperBound(uint256 target) internal view returns (uint256) { uint256 left = 0; uint256 right = sortedValues.length; while (left < right) { uint256 mid = (left + right) / 2; if (sortedValues[mid] <= target) { left = mid + 1; } else { right = mid; } } return left; } function getRange(uint256 low, uint256 high) external view returns (uint256[] memory) { uint256 start = lowerBound(low); uint256 end = upperBound(high); uint256 length = end - start; uint256[] memory result = new uint256[](length); for (uint256 i = 0; i < length; i++) { result[i] = sortedValues[start + i]; } return result; } }
Esse contrato pode ser usado em Cross Chain Swaps para validar rapidamente faixas de preços antes de executar uma troca.

6. Boas Práticas e Armadilhas Comuns
- Array deve estar ordenado: o algoritmo falha silenciosamente se houver desordem.
- Tratamento de limites: sempre verifique se
start == arr.length
ouend == 0
para evitar retornos vazios inesperados. - Tipos de dados: em Solidity, use
uint256
para evitar overflow; em Python, a lista pode conterfloat
ouDecimal
para precisão de preços. - Gas Optimization: prefira variáveis de memória ao invés de storage em loops internos; reutilize variáveis
left
eright
para reduzir custos.
7. Quando Usar Range Binary vs. Outras Estratégias
Embora o range binary seja extremamente eficiente para buscas em arrays estáticos, existem cenários onde outras estruturas são mais adequadas:
Cenário | Estrutura Recomendada |
---|---|
Inserções/remoções frequentes | Árvore AVL ou Red‑Black |
Consultas de intervalo em 2D (ex.: geolocalização) | KD‑Tree ou R‑Tree |
Dados distribuídos em múltiplas shards | Mapas de hash + índices secundários |
8. Ferramentas e Bibliotecas Complementares
Além da bisect
de Python, outras linguagens oferecem utilitários semelhantes:
- Java:
java.util.Collections.binarySearch
(com ajuste para limites). - C++:
std::lower_bound
estd::upper_bound
da STL. - Rust:
slice::binary_search_by
com retornos deOk
ouErr
para limites.
9. Conclusão
O range binary representa uma evolução natural da busca binária clássica, permitindo localizar rapidamente intervalos em conjuntos de dados ordenados. No contexto das criptomoedas, onde cada milissegundo e cada unidade de gas contam, a aplicação correta desse algoritmo pode melhorar significativamente a performance de oráculos, bridges e contratos inteligentes.
Ao dominar o range binary, desenvolvedores ganham uma ferramenta poderosa para construir aplicações low‑latency, escaláveis e seguras – essenciais para o futuro da Web3.