Estou trabalhando em um sistema de tipos e encontrei um problema que parece semelhante ao menor ancestral comum. Dados dois tipos, preciso encontrar a menor sequência de conversões que resultará no mesmo tipo de destino. Se eu tivesse uma árvore de tipos simples, sei como obter o resultado, mas infelizmente tenho uma estrutura gráfica um pouco mais complexa.
Esse gráfico tem alguns pontos-chave. É unidirecional e nenhum loop é formado. Devido a um número ilimitado de tipos, no entanto, não pode ser produzido estaticamente. A distância de um caminho é geralmente bastante baixa. "Parece" mais uma árvore com várias bordas de atalho.
Inicialmente, olhei para o menor ancestral comum, mas ele é descrito principalmente como um algoritmo de árvore. Ainda não perdi a esperança de poder adaptá-lo. A outra possibilidade seria um algoritmo de localização de caminho mais genérico.
Espero que alguém tenha visto esse problema antes, ou um problema semelhante, e possa me dar algumas referências sobre como abordá-lo ainda mais. Parece familiar o suficiente para presumir que algo deve existir e estou apenas procurando os termos / nomes errados.
Aqui está minha tentativa de descrever isso de maneira mais formal.
Haja um gráfico de modo que cada vértice tenha um conjunto de arestas de saída . Observe que, como o gráfico é dinâmico, possivelmente infinito, não há como construir a forma para o gráfico inteiro.
Um caminho é formado a partir de um vértice, seguindo qualquer uma das arestas disponíveis desse nó. . O comprimento desse caminho é igual ao número de vértices na sequência. Não há ciclo possível. O conjunto de todos os caminhos entre dois nós é expresso como.
Observe que pode ser determinado como vazio em um número finito de etapas. Enumerando todo o o conjunto não é praticamente possível.
O problema é encontrar o caminho mais curto de dois vértices para um terceiro vértice. Ou seja, dado, encontrar de modo que caminhos e existe e é mínimo.
fonte
java.lang.Object
)?Respostas:
Se o ancestral comum mais baixo de dois tipos sempre existir e for único, sua estrutura será um junção-semilático. É possível calcular o ancestral comum mais baixo possível, mas a pior complexidade de tempo de execução não é tão boa quanto eu esperava intuitivamente. Eu fiz uma pergunta relacionada há algum tempo, mas fiquei com preguiça de escrever uma resposta depois de encontrar a solução relevante na "literatura". Acabei de escrever a resposta agora, e ela começa da seguinte maneira:
Aqui está a parte relevante do capítulo 2.3.1:
fonte