ความแตกต่างระหว่าง edge cross และ edge forward ใน DFT


11

ในต้นไม้แรกที่มีความลึกมีขอบกำหนดต้นไม้ (เช่นขอบที่ใช้ในการแวะผ่าน)

มีขอบที่เหลืออยู่บางส่วนเชื่อมต่อโหนดอื่น ๆ ความแตกต่างระหว่าง cross edge และ edge forward คืออะไร?

จากวิกิพีเดีย:

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

ขอบที่ไม่ได้ใช้ในการข้ามผ่านที่ชี้จากโหนดหนึ่งไปยังอีกโหนดหนึ่งนั้นสร้างความสัมพันธ์แบบพ่อแม่ลูกหรือไม่


ที่เกี่ยวข้อง: cs.stackexchange.com/questions/99988/…พยายามสร้างอัลกอริธึมซึ่งสำหรับกราฟที่กำกับแล้วจะต้องการสร้างขอบด้านหน้าไปข้างหน้าแทนที่จะเป็นขอบไขว้ในระหว่างการค้นหาเชิงลึกครั้งแรก
pfalcon

คำตอบ:


23

Wikipedia มีคำตอบ:

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

ขอบทุกประเภทปรากฏในภาพนี้ ติดตาม DFS บนกราฟนี้ (โหนดถูกสำรวจตามลำดับตัวเลข) และดูว่าปรีชาของคุณล้มเหลวที่ไหน


สิ่งนี้จะอธิบายไดอะแกรม: -

ไปข้างหน้าขอบ: (u, v), โดยที่ v คือผู้สืบทอดของ u, แต่ไม่ใช่ edge tree มันเป็น edge-tree ที่เชื่อมต่อจุดยอดกับการสืบสายในต้นไม้ DFS

Cross edge: ขอบอื่น ๆ สามารถไประหว่างจุดยอดในต้นไม้ต้นแรกที่มีความลึกเหมือนกันหรือในต้นไม้ที่มีความลึกอันดับหนึ่งที่แตกต่างกัน (คนธรรมดา)
มันเป็นขอบอื่น ๆ ในกราฟ G มันเชื่อมต่อจุดยอดในต้นไม้ DFS สองแบบที่แตกต่างกันหรือสองจุดยอดในต้นไม้ DFS เดียวกันซึ่งไม่ได้เป็นบรรพบุรุษของอื่น ๆ (เป็นทางการ)


ทำไมจึงเป็นไปไม่ได้ที่ 6 จะถูกสำรวจก่อน (ด้านขวาก่อน)? หากเกิดเหตุการณ์นี้จะเรียกว่าขอบ 2-> 3
soandos

@soos ฉันขอแนะนำให้คุณใช้เวลาในการติดตามอัลกอริทึม สมมติว่าชาว Wikipedians ไม่ได้ทำอะไรผิดพลาดภาพอธิบายการใช้ DFS โดยสุจริตบนกราฟนี้และดังนั้นจึงมีวิธีที่จะทำให้อัลกอริทึมเหมาะสมกับการติดตามนี้ ประเภทของขอบมีการอธิบายอย่างชัดเจนเพียงพอใน Wikipedia และคุณสามารถดูตัวอย่างนี้ได้
Yuval Filmus

ฉันเข้าใจว่านี่เป็นวิธีที่ถูกต้องในการทำ DFS ฉันแค่ถามว่ามันทำอย่างอื่น
soandos

จากนั้นผลลัพธ์จะแตกต่างกัน ฉันขอโทษคุณต้องทำงานด้วยตัวเอง
Yuval Filmus

2
@soandos โดยทั่วไปจะมี traversals DFS หลายรายการได้เป็นอย่างดี ความคิดที่ใช้ที่นี่มีความสัมพันธ์กับการสำรวจเส้นทางที่กำหนดและจะแตกต่างกันสำหรับการสำรวจเส้นทางหลายครั้ง
กราฟิลส์

9

การสำรวจเส้นทาง DFS ในกราฟที่ไม่ได้ทำการบอกทิศทางจะไม่ปล่อยให้เกิดการข้ามเนื่องจากขอบทั้งหมดที่เกิดขึ้นบนจุดยอดจะถูกสำรวจ

อย่างไรก็ตามในกราฟกำกับคุณอาจพบขอบที่นำไปสู่จุดสุดยอดที่ถูกค้นพบมาก่อนว่าจุดยอดนั้นไม่ใช่บรรพบุรุษหรือจุดยอดของจุดยอดปัจจุบัน ขอบนั้นเรียกว่ากากบาท


Aporov ขอบคุณสำหรับการตอบสนอง มันยังดูเหมือนว่าเมื่อคุณไปถึงจุดสุดยอด 6 ใน DFS ตามที่ไดอะแกรมใน Wikipedia คุณมีสามขอบเพื่อสำรวจจาก 6 ณ จุดนั้นจุดยอด 6 คือ "ปัจจุบัน" ในที่สุดคุณจะข้ามไปที่จุดสุดยอด 3 ในขณะที่ 3 ได้รับการเยี่ยมชมแล้วอย่างไรก็ตามเนื่องจากมีขอบจาก 6 ถึง 3 จากนั้น 3 เป็นลูกหลานของจุดสุดยอด "ปัจจุบัน" 6 หากเป็นเช่นนั้นจะเป็นการละเมิด ความหมายของกากบาท จะต้องมีสิ่งที่มากกว่าคำจำกัดความที่ไม่ได้ถูกทำให้ชัดเจนมาก

ในความเป็นจริง DFS มีเพียงต้นไม้ขอบสำหรับขอบหลัง (แนะนำอัลกอริทึม Thm. 22.10)
jrhee17

2

ในการแวะผ่าน DFS โหนดจะเสร็จสิ้นเมื่อลูกทั้งหมดของพวกเขาเสร็จสิ้น หากคุณทำเครื่องหมายเวลาค้นหาและสิ้นสุดสำหรับแต่ละโหนดในระหว่างการแวะผ่านคุณสามารถตรวจสอบเพื่อดูว่าโหนดนั้นเป็นผู้สืบทอดหรือไม่โดยการเปรียบเทียบเวลาเริ่มต้นและสิ้นสุด ในความเป็นจริงการแวะผ่าน DFS ใด ๆ จะแบ่งขอบตามกฎต่อไปนี้

ให้ d [node] เป็นเวลาที่ค้นพบของ node เช่นเดียวกันให้ f [node] เป็นเวลาสิ้นสุด

ทฤษฎีบทวงเล็บสำหรับทุกท่าน, v, ถือหนึ่งในสิ่งต่อไปนี้:
1. d [u] <f [u] <d [v] <f [v] หรือ d [v] <f [v] <d [u ] <f [u] และไม่ใช่ทั้งคุณและ v เป็นผู้สืบทอดของอีกกลุ่ม

  1. d [u] <d [v] <f [v] <f [u] และ v เป็นทายาทของ u

  2. d [v] <d [u] <f [u] <f [v] และ u เป็นทายาทของ v

ดังนั้น d [u] <d [v] <f [u] <f [v] ไม่สามารถเกิดขึ้นได้
เช่นเดียวกับวงเล็บ: () [], ([]) และ [()] นั้นโอเค แต่ ([)] และ [(]) นั้นไม่โอเค

ตัวอย่างเช่นพิจารณากราฟที่มีขอบ:
A -> B
A -> C
B -> C

ให้ลำดับของการเยี่ยมชมถูกแสดงโดยสตริงของโหนดฉลากโดยที่ "ABCCBA" หมายถึง A -> B -> C (เสร็จสิ้น) B (เสร็จสิ้น) A (เสร็จสิ้น) A (เสร็จสิ้น) คล้ายกับ (())

ดังนั้น "ACCBBA" อาจเป็นแบบจำลองสำหรับ "(() ())"

ตัวอย่าง:
"CCABBA": จากนั้น A -> C เป็น cross edge เนื่องจาก CC ไม่ได้อยู่ภายใน A.
"ABCCBA": A -> C เป็นขอบไปข้างหน้า (ผู้สืบทอดทางอ้อม)
"ACCBBA": จากนั้น A -> C คือขอบต้นไม้ (สืบทอดโดยตรง)

แหล่งที่มา:
CLRS:
https://mitpress.mit.edu/books/introduction-algorithms
Lecure Notes http://www.personal.kent.edu/~rmuhamma/Algorithms/MyAlgorithms/GraphAlgor/depthSearch.htm

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