อัลกอริทึมการติดฉลากเวลาเชิงเส้นสำหรับต้นไม้หรือไม่?


12

ฉันมีต้นไม้ที่ไม่มีทิศทางซึ่งมีจุดสูงสุดที่ฉันต้องการติดป้าย โหนดใบไม้ควรมีป้ายกำกับหนึ่งรายการ จากนั้นสมมติว่าใบถูกลบออก ในต้นไม้ที่เหลือใบควรจะติดป้ายที่สอง กระบวนการนี้จะดำเนินต่อไปในลักษณะที่ชัดเจนจนกระทั่งจุดยอดทั้งหมดมีป้ายกำกับ เหตุผลที่ฉันทำเช่นนี้คือฉันต้องการเก็บจุดยอดในคิวและผ่านพวกเขา "ทิ้งก่อน" มีวิธีง่าย ๆ ในการทำเวลาO(n+m)นี้หรือไม่?

ฉันสามารถแก้ปัญหาด้วยการทำ BFS ในทุกขั้นตอน แต่ในกรณีที่เลวร้ายที่สุดในทุกขั้นตอนที่ฉันไปถึงจุดสุดยอดทุกอันให้เอาใบสองใบออกและเข้าพวกเขา ฉันเชื่อว่านี่ใช้เวลากำลังสอง

อีกแนวคิดหนึ่งคือค้นหาใบทั้งหมดก่อนแล้วจึงทำ BFS จากทุก ๆ ใบ นี่ไม่ได้ให้ทางออกที่ต้องการแก่ฉัน ตัวอย่างเช่นลองพิจารณา "กราฟรูปทรงมงกุฎ" ดังในรูปด้านล่าง โซลูชั่นที่ต้องการแสดงขึ้น แต่การเปิดตัว BFS จากแต่ละใบไม้จะทำให้มีการใช้ป้ายกำกับเพียงสองป้ายเท่านั้น

ป้อนคำอธิบายรูปภาพที่นี่

อุดมคติแล้วอัลกอริธึมเชิงเส้นเวลาก็จะอธิบายและนำไปปฏิบัติได้ง่าย

คำตอบ:


8

ต้นไม้ที่ไม่ได้ใช้ราก

O(E+VlogV)

  • วางจุดยอดทั้งหมดในคิวลำดับความสำคัญโดยลำดับความสำคัญของพวกเขาคือระดับของพวกเขา
  • ในขณะที่คิวไม่ว่างเปล่า:
    • v10
    • σ(v)=1+maxσ(u)uv
    • ลบจากลำดับความสำคัญของเพื่อนบ้านที่เหลือไม่ซ้ำกันของ (ถ้ามี)1u

ในความเป็นจริงเราไม่ต้องการคิวลำดับความสำคัญและอัลกอริทึมนี้สามารถนำมาใช้โดยใช้คิวแบบง่าย ๆ ในเวลา :O(E+V)

  • เริ่มต้นอาร์เรย์ของความยาวด้วยองศาของจุดยอดทั้งหมดV
  • เริ่มต้นอาร์เรย์ความยาวอีกชุดด้วย "alive"V
  • ผ่านอาร์เรย์แรกไปหนึ่งครั้งแล้วกดจุดยอดทั้งหมดขององศาไปที่คิว1
  • ในขณะที่คิวไม่ว่างเปล่า:
    • แสดง a เวอร์เท็กซ์ .v
    • Letที่ไปมากกว่าเดิมเพื่อนบ้านทั้งหมดของโวลต์σ(v)=1+maxσ(u)uv
    • ทำเครื่องหมายว่า "ตายแล้ว"v
    • ถ้ามีบางส่วน "ชีวิต" เพื่อนบ้านลบจากองศาของมึงvu1u
    • หากระดับใหม่ของคือให้กดไปที่คิวu1u

ต้นไม้ที่หยั่งราก

ใช้ DFS แทน นี่คือภาพร่างของอัลกอริทึม

  • กำหนดโหนดถ้าเป็นใบชุด1vvd(v)=1
  • หากไม่ใช่ leaf ให้รันอัลกอริธึมบน children ทั้งหมดแล้วปล่อยให้โดยที่ไปเหนือกลุ่มของเด็กทั้งหมดvd(v)=1+maxd(u)u

คุณเรียกใช้อัลกอริทึมนี้บนราก


ถูกต้องหรือไม่ พิจารณาต้นไม้ 1-> 2-> 3-> 4-> 5 โดยที่ 1 คือราก 2 ควรได้รับฉลาก 1 แต่คุณให้ 3 หรือโดยเด็กคุณหมายถึงเพื่อนบ้าน โหนดใดที่เราจะเริ่ม dfs จากนั้น
Knoothe

การใช้งานของฉันคือ "ปิดทีละคน" แต่ตามคำอธิบายของคุณควรได้รับป้ายกำกับเนื่องจากคุณต้องลบจากนั้นจากนั้นจากนั้นและเพียงกลายเป็นใบไม้ 245432
Yuval Filmus

ฉันไม่ได้ถามคำถาม :-) ฉันตีความคำถามว่าเป็น: ต้นไม้ที่ไม่ได้บอกทาง ติดป้ายใบไม้ทั้งหมด ลบทิ้ง รีเคลมต้นไม้ที่เกิดขึ้น ในกรณีนั้นทรีเป็นจริง 1-2-3-4-5 ขั้นตอนที่ 1 คุณลบ 1 และ 5 จากนั้น 2 และ 4 และ 3 จากนั้น 3 ดูวรรคเกี่ยวกับ "กราฟกราฟ" นี่เป็นหนึ่งในอัลกอริธึมคลาสสิคที่จะค้นหาจุดศูนย์กลางของต้นไม้
Knoothe

1 ไม่ใช่ใบไม้ มันไกลมากจากการเป็นใบไม้มันเป็นราก ฉันตีความคำถามว่าเป็นการกำหนดเป้าหมายต้นไม้ที่ถูกรูท บางทีเราควรรอให้ OP ตอบกลับ
Yuval Filmus

2
@YuvalFilmus เพียงเพื่อโยน 2 เซ็นต์ของฉันในนั้นไม่ควรจะเป็น ? ใบไม้คือถ้าคุณลบออกแล้วใบไม้ใหม่ควรเป็นดังนั้นจึงเป็นการวัดว่าคุณต้องลบเลเยอร์จำนวนเท่าใดก่อนที่จุดสุดยอดจะกลายเป็นใบไม้ ด้วย min, จุดสุดยอดใด ๆ ที่อยู่ติดกับใบไม้จะได้รับ 2 แต่มันอาจไม่กลายเป็นใบไม้เมื่อใบถูกลบ ประโยคนั้นมีใบไม้เหลืออยู่มากเกินไป ฉันต้องการไม้กวาด 1+max{d(u)}12
Luke Mathieson

2

คำตอบที่ตรงไปตรงมามีดังนี้:

  • เปิดนี้เป็นกราฟกำกับที่เรามีขอบจากแต่ละโหนดไปยังผู้ปกครองของโวลต์โปรดทราบว่าคุณจะได้รับ dag (กราฟ acyclic โดยตรง)(u,v)uv

  • จัดเรียงกราฟทอพอโลยี

  • สแกนจุดยอดตามลำดับที่เรียง ติดฉลากจุดสุดยอดแต่ละจุดด้วยป้ายชื่อที่ใหญ่ที่สุดบนหน้ากระดาษก่อนหน้า เนื่องจากเรากำลังสแกนเพื่อทอพอโลยีทั้งหมดของรุ่นก่อนของแล้วจะได้รับฉลากก่อนที่เราจะพยายามที่จะฉลากวีvv

แต่ละขั้นตอนเหล่านี้สามารถทำได้ในเวลาดังนั้นเวลาทำงานรวมเป็นm) ฉันพูดถึงวิธีการทางเลือกนี้เฉพาะในกรณีที่คุณคิดว่าเข้าใจง่ายกว่าคำตอบของ YuvalO(n+m)O(n+m)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.