Saya memiliki hutan, yaitu node dengan tepi terarah dan tanpa siklus (terarah atau tidak terarah). Saya mendefinisikan ketinggian suatu simpul sebagai 0 jika tidak memiliki tepi masuk, atau jumlah tepi maksimum untuk dilalui secara terbalik untuk mencapai puncak ketinggian 0.
Saya juga tahu bahwa derajat rata-rata sebuah simpul adalah konstanta kecil, katakanlah 2 atau lebih. Untuk menemukan ketinggian semua simpul, saya dapat memikirkan dua algoritma:
Algoritma Berjalan
- Pergi melalui dan tandai untuk simpul tanpa tepi masuk.
- Untuk setiap simpul dengan , ikuti tepi keluar, perbarui ketinggian setiap simpul yang ditemui jika ketinggian sebelumnya lebih kecil.
Algoritma Perbatasan
- Pergi melalui dan tandai untuk simpul tanpa tepi masuk, dan tandai ini sebagai perbatasan.
- Untuk setiap titik perbatasan, lihat apakah orang tuanya memiliki anak di atau di bawah batas, Jika ya, tandai orang tua memiliki ditambah tinggi terbesar di antara anak-anaknya. Tandai orang tua sebagai berada di perbatasan.
- Ulangi 2 sampai tidak ada apa-apa di luar perbatasan.
Pertanyaan saya:
- Apakah ada nama untuk masalah ini, dan solusi tercepat yang terkenal?
- Saya cenderung berpikir hanya berjalan dari semua simpul adalah solusi tercepat. Apakah saya benar?
sumber
I don't know if this problem has an official name or not. Your title sums it up well enough. Walking up from the 0 height nodes will be fast, provided you take care to avoid duplicate work. Suppose you have a node with many children and a long path above this node to the root. Suppose also that the heights of each of the children are different. Each child may update the height of the node in question. That's ok. But you should avoid also updating the long path above that node until all its children have reported their heights.
The resulting algorithm will run in linear time, and the pseudo-code would look something like this:
sumber
A problem so similar it might be of interest is "Parallel Prefix on Rooted Directed Trees." The algorithm finds the number of edges to the root from each node. So the roots ends up with a the value 0, while e.g. the bottom right node would end up with a value of two.
Note that the algorithm below solves the more general problem for weighted edges, but you can just initialize the W(i) to 1 for all i. And each node i's successor is given by P(i)=j.
The image below illustrates the "halving" of the path lengths and makes the logarithmic running time easy to understand. It does not show the node heights computed though.
(from "Introduction to Parallel Algorithms" by Joseph Jaja).
Using multiple processors, it is solvable in O(lg n) time, but uses O(n lg n) operations. There is a hack to get it down to linear work, but it is slightly involved.
sumber
S(i)
represent?