Ran G. ให้คำแนะนำเกี่ยวกับอัลกอริทึมที่มีประสิทธิภาพแม้ว่าบางทีเขาอาจจะทิ้งรายละเอียดไว้บ้าง การคำนวณเส้นทางรูตทั้งหมดจะไม่มีประสิทธิภาพเล็กน้อยหากคุณทำงานซ้ำแล้วซ้ำอีกตัวอย่างเช่นหากคุณคำนวณแต่ละเส้นทางแล้วคำนวณความยาว
ดำเนินการขั้นตอนวิธีแบบเรียกซ้ำต่อไปนี้เริ่มต้นด้วยLongestPath(root)
จะให้สิ่งที่คุณต้องการ โดยพื้นฐานแล้วมันจะคำนวณเส้นทางที่ยาวที่สุดสำหรับแต่ละทรีย่อย ที่แต่ละโหนดต้องสร้างเส้นทางใหม่และคืนค่าที่ยาวที่สุด
LongestPath(node)
If node is a leaf, return (node,0)
If node is not a leaf:
For each edge (node,length,next):
Let (p,l) = LongestPath(next)
Let (path,len) = (p++[next], l + length)
Return element (path,len) from previous step with largest value len
นี่คือการรวมกันหากรหัสหลอกด้วยสัญกรณ์ Haskell บางอย่างดังนั้นฉันหวังว่ามันจะเข้าใจได้