Árvore cartesiana
Na ciência da computação, uma árvore cartesiana é uma árvore binária derivada de uma sequência de números distintos. Para construir a árvore cartesiana, sua raiz é definida como o menor número da sequência, e suas subárvores esquerda e direita são construídas recursivamente a partir das subsequências anteriores e posteriores a esse número. Ela é definida de maneira única como uma heap mínimo cuja travessia simétrica retorna a sequência original.
As árvores cartesianas são definidas usando árvores binárias, que são uma forma de árvore enraizada. Para construir a árvore cartesiana de uma determinada sequência de números distintos, define-se sua raiz como o menor número da sequência, e constroem-se recursivamente suas subárvores esquerda e direita a partir das subsequências anteriores e posteriores a esse número, respectivamente. Como caso-base, quando uma dessas subsequências está vazia, não há filho esquerdo ou direito. Também é possível caracterizar a árvore cartesiana diretamente, em vez de recursivamente, usando suas propriedades de ordenação. Em qualquer árvore, a subárvore enraizada em um determinado nó consiste em todos os outros nós que podem alcançá-lo seguindo repetidamente os ponteiros para os pais. A árvore cartesiana de uma sequência de números distintos é definida pelas seguintes propriedades: Essas duas definições são equivalentes: a árvore definida recursivamente conforme descrito acima é a única árvore que possui as propriedades listadas anteriormente. Se uma sequência de números contiver repetições, uma árvore cartesiana pode ser determinada para ela seguindo uma regra consistente de desempate antes de aplicar a construção acima. Por exemplo, o primeiro de dois elementos iguais pode ser tratado como sendo o menor dos dois.
As árvores cartesianas foram introduzidas e nomeadas por Vuillemin (1980), que as utilizou como exemplo da interação entre a combinatória geométrica e o projeto e a análise de estruturas de dados. Em particular, Vuillemin utilizou essas estruturas para analisar a complexidade de caso médio das operações de concatenação e divisão em árvores binárias de busca. O nome deriva do sistema de coordenadas cartesianas do plano: em uma versão dessa estrutura, assim como na aplicação de busca por intervalo bidimensional discutida abaixo, uma árvore cartesiana para um conjunto de pontos tem a ordem dos pontos ordenados por suas coordenadas x {\displaystyle x} como sua ordem de travessia simétrica, e possui a propriedade de heap de acordo com as coordenadas y {\displaystyle y} dos pontos. Vuillemin descreveu tanto essa versão geométrica da estrutura quanto a definição apresentada aqui, na qual uma árvore cartesiana é definida a partir de uma sequência. O uso de sequências em vez de coordenadas de pontos fornece um contexto mais geral, permitindo que a árvore cartesiana seja aplicada também a problemas não geométricos.
Uma árvore cartesiana pode ser construída em tempo linear a partir de sua sequência de entrada. Um método consiste em processar os valores da sequência da esquerda para a direita, mantendo a árvore cartesiana dos nós já processados em uma estrutura que permita percorrer a árvore tanto para cima quanto para baixo. Para processar cada novo valor a {\displaystyle a} , começa-se no nó que representa o valor imediatamente anterior a a {\displaystyle a} na sequência e segue-se o caminho desse nó até a raiz da árvore, até encontrar um valor b {\displaystyle b} menor que a {\displaystyle a} . O nó a {\displaystyle a} torna-se o filho direito de b {\displaystyle b} , e o antigo filho direito de b {\displaystyle b} torna-se o novo filho esquerdo de a {\displaystyle a} . O tempo total desse procedimento é linear, pois o tempo gasto na busca pelo pai b {\displaystyle b} de cada novo nó a {\displaystyle a} pode ser amortizado pelo número de nós removidos do caminho mais à direita da árvore.
Busca por intervalo e menores ancestrais comuns
As árvores cartesianas fazem parte de uma estrutura de dados eficiente para consultas do mínimo em intervalo. Uma entrada para esse tipo de consulta especifica uma subsequência contígua da sequência original; a saída da consulta deve ser o menor valor nessa subsequência. Em uma árvore cartesiana, esse valor mínimo pode ser encontrado no menor ancestral comum dos valores mais à esquerda e mais à direita da subsequência. Por exemplo, na subsequência (12, 10, 20, 15, 18) da sequência de exemplo, o menor valor da subsequência (10) forma o menor ancestral comum dos valores mais à esquerda e mais à direita (12 e 18). Como os menores ancestrais comuns podem ser encontrados em tempo constante por consulta, usando uma estrutura de dados que ocupa espaço linear e pode ser construída em tempo linear, os mesmos limites se aplicam ao problema de encontrar o mínimo em um intervalo.
Como árvore binária de busca
A árvore cartesiana de uma sequência ordenada é simplesmente um grafo caminho, enraizado em sua extremidade mais à esquerda. A busca binária nessa árvore degenera em uma busca sequencial pelo caminho. No entanto, uma construção diferente utiliza árvores cartesianas para gerar árvores binárias de busca de profundidade logarítmica a partir de sequências ordenadas de valores. Isso pode ser feito gerando números de prioridade para cada valor e usando a sequência de prioridades para gerar uma árvore cartesiana. Essa construção também pode ser vista, de forma equivalente, no contexto geométrico descrito anteriormente, no qual as coordenadas x {\displaystyle x} de um conjunto de pontos são os valores de uma sequência ordenada e as coordenadas y {\displaystyle y} são suas prioridades.
Na ordenação
Levcopoulos & Petersson (1989) descrevem um algoritmo de ordenação baseado em árvores cartesianas. Eles descrevem o algoritmo com base em uma árvore que possui o valor máximo na raiz, mas ele pode ser modificado diretamente para utilizar uma árvore cartesiana segundo a convenção de que o menor valor fica na raiz. Por consistência, é essa versão modificada do algoritmo que é descrita a seguir. O algoritmo de Levcopoulos–Petersson pode ser visto como uma versão do selection sort ou do heapsort que mantém uma fila de prioridade de candidatos a valores mínimos e, a cada etapa, encontra e remove o menor valor dessa fila, transferindo-o para o final de uma sequência de saída. Em seu algoritmo, a fila de prioridade contém apenas elementos cujo pai na árvore cartesiana já foi encontrado e removido. Assim, o algoritmo consiste nas seguintes etapas:
No casamento de padrões
O problema do casamento de árvores cartesianas foi definido como uma forma generalizada de casamento de cadeias na qual se procura uma subcadeia (ou, em alguns casos, uma subsequência) de uma cadeia fornecida que possua uma árvore cartesiana com a mesma forma que um determinado padrão. Foram desenvolvidos algoritmos rápidos para variações do problema com um único padrão ou com múltiplos padrões, bem como estruturas de dados análogas à árvore de sufixos e a outras estruturas de indexação de texto.


