mirror of
https://github.com/trekhleb/javascript-algorithms.git
synced 2025-07-19 04:15:02 +08:00
49 lines
2.5 KiB
Markdown
49 lines
2.5 KiB
Markdown
# Árvore de Segmento (Segment Tree)
|
|
|
|
Na ciência da computação, uma **árvore de segmento** também conhecida como
|
|
árvore estatística é uma árvore de estrutura de dados utilizadas para
|
|
armazenar informações sobre intervalores ou segmentos. Ela permite pesquisas
|
|
no qual os segmentos armazenados contém um ponto fornecido. Isto é,
|
|
em princípio, uma estrutura estática; ou seja, é uma estrutura que não pode
|
|
ser modificada depois de inicializada. Uma estrutura de dados similar é a
|
|
árvore de intervalos.
|
|
|
|
Uma árvore de segmento é uma árvore binária. A raíz da árvore representa a
|
|
_array_ inteira. Os dois filhos da raíz representam a primeira e a segunda
|
|
metade da _array_. Similarmente, os filhos de cada nó correspondem ao número
|
|
das duas metadas da _array_ correspondente do nó.
|
|
|
|
Nós construímos a árvore debaixo para cima, com o valor de cada nó sendo o
|
|
"mínimo" (ou qualquer outra função) dos valores de seus filhos. Isto consumirá
|
|
tempo `O(n log n)`. O número de oprações realizadas é equivalente a altura da
|
|
árvore, pela qual consome tempo `O(log n)`. Para fazer consultas de intervalos,
|
|
cada nó divide a consulta em duas partes, sendo uma sub consulta para cada filho.
|
|
Se uma pesquisa contém todo o _subarray_ de um nó, nós podemos utilizar do valor
|
|
pré-calculado do nó. Utilizando esta otimização, nós podemos provar que somente
|
|
operações mínimas `O(log n)` são realizadas.
|
|
|
|

|
|
|
|

|
|
|
|
## Aplicação
|
|
|
|
Uma árvore de segmento é uma estrutura de dados designada a realizar
|
|
certas operações de _array_ eficientemente, especialmente aquelas envolvendo
|
|
consultas de intervalos.
|
|
|
|
Aplicações da árvore de segmentos são nas áreas de computação geométrica e
|
|
sistemas de informação geográficos.
|
|
|
|
A implementação atual da Árvore de Segmentos implica que você pode passar
|
|
qualquer função binária (com dois parâmetros de entradas) e então, você
|
|
será capaz de realizar consultas de intervalos para uma variedade de funções.
|
|
Nos testes você poderá encontrar exemplos realizando `min`, `max` e consultas de
|
|
intervalo `sum` na árvore segmentada (SegmentTree).
|
|
|
|
## Referências
|
|
|
|
- [Wikipedia](https://en.wikipedia.org/wiki/Segment_tree)
|
|
- [YouTube](https://www.youtube.com/watch?v=ZBHKZF5w4YU&index=65&list=PLLXdhg_r2hKA7DPDsunoDZ-Z769jWn4R8)
|
|
- [GeeksForGeeks](https://www.geeksforgeeks.org/segment-tree-set-1-sum-of-given-range/)
|