Eu tenho uma floresta, ou seja, nós com bordas direcionadas e sem ciclos (direcionados ou não direcionados). Eu defino a altura de um vértice como 0 se não tiver arestas recebidas ou o número máximo de arestas a serem movidas em ré para alcançar um vértice de altura 0.
Eu também sei que o grau médio de um nó é uma pequena constante, digamos 2 ou mais. Para encontrar a altura de todos os vértices, posso pensar em dois algoritmos:
Algoritmo de Caminhada
- Percorra e marque para vértices sem arestas de entrada.
- Para cada vértice com , siga as arestas de saída, atualizando a altura de cada vértice encontrado, se a altura anterior for menor.
Algoritmo de Fronteira
- Percorra e marque para vértices sem arestas de entrada e marque-os como a fronteira.
- Para cada vértice de fronteira, veja se o pai tem filhos na fronteira ou abaixo dela. Se houver, marque o pai como tendo mais a maior altura entre seus filhos. Marque os pais como estando na fronteira.
- Repita 2 até que não haja nada além da fronteira.
Minhas perguntas:
- Existe um nome para esse problema e uma solução mais rápida conhecida?
- Eu costumo pensar em simplesmente sair de todas as vértices é a solução mais rápida. Estou certo?
fonte
Não sei se esse problema tem um nome oficial ou não. Seu título resume bem o suficiente. Subir dos nós de altura 0 será rápido, desde que você tome cuidado para evitar trabalhos duplicados. Suponha que você tenha um nó com muitos filhos e um caminho longo acima desse nó para a raiz. Suponha também que as alturas de cada uma das crianças sejam diferentes. Cada filho pode atualizar a altura do nó em questão. Isso está ok. Mas você deve evitar também atualizar o caminho longo acima desse nó até que todos os seus filhos relatem suas alturas.
O algoritmo resultante será executado em tempo linear, e o pseudo-código seria algo parecido com isto:
fonte
Um problema tão semelhante que pode ser interessante é "Prefixo paralelo em árvores direcionadas enraizadas". O algoritmo encontra o número de arestas na raiz de cada nó. Portanto, as raízes terminam com o valor 0, enquanto, por exemplo, o nó inferior direito terminaria com o valor dois.
Observe que o algoritmo abaixo resolve o problema mais geral para arestas ponderadas, mas você pode apenas inicializar W (i) para 1 para todos os i. E o sucessor de cada nó i é dado por P (i) = j.
A imagem abaixo ilustra a "metade" dos comprimentos do caminho e facilita o tempo de execução logarítmico. Porém, ele não mostra as alturas dos nós calculadas.
(de "Introdução aos algoritmos paralelos", de Joseph Jaja).
Usando vários processadores, é solucionável no tempo O (lg n), mas usa operações O (n lg n). Há um truque para reduzi-lo ao trabalho linear, mas está um pouco envolvido.
fonte
S(i)
representa?