Ada algoritma standar ini untuk menemukan jalur terpanjang di pohon-pohon yang tidak diarahkan menggunakan dua pencarian kedalaman-pertama:
- Mulai DFS dari simpul acak dan temukan simpul terjauh darinya; katakan itu .v ′
- Sekarang mulai DFS dari untuk menemukan titik terjauh dari itu. Jalur ini adalah jalur terpanjang dalam grafik.
Pertanyaannya adalah, dapatkah ini dilakukan dengan lebih efisien? Bisakah kita melakukannya dengan DFS atau BFS tunggal?
(Ini dapat secara ekuivalen digambarkan sebagai masalah menghitung diameter pohon yang tidak diarahkan.)
algorithms
graphs
trees
emmy
sumber
sumber
Jawaban:
Kami melakukan pencarian mendalam-pertama dalam urutan pos dan hasil agregat di jalan, yaitu kami memecahkan masalah secara rekursif.
Untuk setiap simpul dengan anak-anak u 1 , … , u k (di pohon pencarian) ada dua kasus:v u1,…,uk
Dalam kasus kedua, kita harus menggabungkan satu atau dua jalur terpanjang dari ke salah satu subtree; ini tentu saja untuk daun terdalam. Panjang jalan adalah H ( k ) + H ( k - 1 ) + 2 jika k > 1 , atau H ( k ) + 1 jika k = 1 , dengan H = { h ( T u i ) ∣ i = 1 , ...v H(k)+H(k−1)+2 k>1 H(k)+1 k=1 set multi ketinggian subtree¹.H={h(Tui)∣i=1,…,k}
Dalam kode semu, algoritmenya terlihat seperti ini:
sumber
height1 + height2
adalah panjang jalan ini. Jika memang jalan terpanjang, itu dipilih olehmax
. Ini juga dijelaskan dalam teks di atas, jadi saya tidak melihat masalah Anda? Tentunya Anda harus recurse untuk mencari tahu apakah itu memang jalan terpanjang, dan bahkan jika tidak ada salahnya (wrt correctness) untuk recurse.height2
secara eksplisit menghapusheight1
dari pertimbangan, jadi bagaimana bisa memilih anak yang sama dua kali? Itu, juga, telah dijelaskan dalam teks pengantar.longestPathHeight(T)
mengembalikan pasangan(h,d)
, di manah
ketinggianT
dand
diameterT
. (Benar?)Ini bisa diselesaikan dengan cara yang lebih baik. Juga, kita dapat mengurangi kompleksitas waktu menjadi O (n) dengan sedikit modifikasi dalam struktur data dan menggunakan pendekatan berulang. Untuk analisis terperinci dan berbagai cara untuk menyelesaikan masalah ini dengan berbagai struktur data.
Berikut ringkasan dari apa yang ingin saya jelaskan di posting blog saya :
Pendekatan Rekursif - Diameter Pohon Cara lain untuk mendekati masalah ini adalah sebagai berikut. Seperti yang kami sebutkan di atas bahwa diameter bisa
Yang berarti bahwa diameternya dapat diturunkan secara ideal
Dan kita tahu bahwa diameternya adalah jalur terpanjang, jadi kita mengambil maksimum 1 dan 2 kalau-kalau itu terletak di salah satu sisi atau wee ambil 3 jika membentang melalui root.
Pendekatan berulang - Diameter Pohon
Kami memiliki pohon, kami membutuhkan informasi meta dengan masing-masing simpul sehingga setiap simpul tahu berikut:
Setelah setiap node memiliki informasi ini, kita memerlukan variabel sementara untuk melacak jalur maksimum. Pada saat algoritma selesai, kami memiliki nilai diameter dalam variabel temp.
Sekarang, kita perlu menyelesaikan masalah ini dengan pendekatan bottom-up, karena kita tidak tahu tentang tiga nilai untuk root. Tetapi kita tahu nilai-nilai ini untuk daun.
Langkah-langkah untuk dipecahkan
Pada titik tertentu,
sumber
Di bawah ini adalah kode yang mengembalikan jalur diameter dengan hanya menggunakan satu DFS traversal. Dibutuhkan ruang ekstra untuk melacak diameter terbaik yang terlihat sejauh ini serta jalur terpanjang yang dimulai pada simpul tertentu di pohon. Ini adalah pendekatan pemrograman dinamis berdasarkan fakta bahwa jalur berdiameter terpanjang tidak menyertakan root, atau merupakan kombinasi dari dua jalur terpanjang dari tetangga root. Jadi kita perlu dua vektor untuk melacak informasi ini.
sumber