การค้นหากราฟ: กว้างมากและลึกก่อน


78

เมื่อค้นหากราฟมีสองขั้นตอนวิธีการง่าย: กว้างแรกและความลึกแรก (มักจะทำโดยการเพิ่มโหนดกราฟ adjactent ทั้งหมดไปยังคิว (กว้างแรก) หรือสแต็ค (ความลึกแรก))

ตอนนี้มีข้อได้เปรียบของอีกคนหนึ่งหรือไม่

สิ่งที่ฉันคิดได้:

  • หากคุณคาดหวังว่าข้อมูลของคุณจะอยู่ด้านล่างของกราฟความลึกอันดับแรกอาจพบได้ก่อนหน้านี้เนื่องจากคุณจะลงไปในส่วนที่ลึกกว่าของกราฟอย่างรวดเร็ว
  • ในทางกลับกันหากคุณคาดหวังว่าข้อมูลของคุณจะค่อนข้างไกลในกราฟความกว้างแรกอาจให้ผลลัพธ์ก่อนหน้านี้

มีอะไรที่ฉันพลาดไปหรือว่ามันเป็นความชอบส่วนตัว?

คำตอบ:


43

ฉันต้องการเสนอราคาคำตอบจาก Stack Overflowโดยhstoerrซึ่งครอบคลุมปัญหาอย่าง:

ที่หนักขึ้นอยู่กับโครงสร้างของต้นไม้ค้นหาและจำนวนและตำแหน่งของการแก้ปัญหาที่
หากคุณรู้ว่าวิธีแก้ปัญหาอยู่ไม่ไกลจากรูทของทรีการค้นหาความกว้างครั้งแรก (BFS) อาจจะดีกว่า หากทรีลึกและโซลูชันหายากการค้นหาความลึกครั้งแรก (DFS) อาจหยั่งรากตลอดไป แต่ BFS อาจเร็วขึ้น หากแผนผังกว้างมาก BFS อาจต้องการหน่วยความจำมากเกินไปดังนั้นจึงอาจไม่สามารถใช้งานได้อย่างสมบูรณ์ หากการแก้ปัญหาเป็นประจำ แต่อยู่ลึกลงไปในทรี BFS อาจเป็นไปไม่ได้ หากโครงสร้างการค้นหาลึกมากคุณจะต้อง จำกัด ความลึกของการค้นหาสำหรับการค้นหาความลึกครั้งแรก (DFS) อย่างไรก็ตาม (เช่นการทำซ้ำลึกลงไป)

แต่นี่เป็นเพียงกฎของหัวแม่มือ คุณอาจต้องทำการทดสอบ

Rafał Dowgirdพูดด้วย:

อัลกอริทึมบางอย่างขึ้นอยู่กับคุณสมบัติเฉพาะของ DFS (หรือ BFS) ในการทำงาน ตัวอย่างเช่นอัลกอริทึม Hopcroft และ Tarjan สำหรับการค้นหาส่วนประกอบที่เชื่อมต่อ 2 ใช้ประโยชน์จากข้อเท็จจริงที่ว่าแต่ละโหนดที่เยี่ยมชมแล้วพบโดย DFS อยู่บนเส้นทางจากรากไปยังโหนดสำรวจในปัจจุบัน


5
ผมไม่เข้าใจว่าทำไมคำตอบนี้มี 27 upvotes และมันเป็นสิ่งผสมของ 2 คำตอบอื่น ๆ ซึ่งโดยวิธีการที่มีความคิดทั่วไปเพียงเกี่ยวกับ ...
nbro

37

จุดหนึ่งที่มีความสำคัญในโลกของเราแบบมัลติคอร์: BFS นั้นง่ายต่อการขนานกันมากขึ้น นี่เป็นเหตุผลที่สมเหตุสมผล (ส่งกระทู้สำหรับเด็กแต่ละคน) และสามารถพิสูจน์ได้ว่าเป็นเช่นนั้น ดังนั้นหากคุณมีสถานการณ์ที่คุณสามารถใช้ประโยชน์จากความเท่าเทียมแล้ว BFS เป็นวิธีที่จะไป


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

คำตอบนี้ไม่สมควรได้รับเกิน 20 คะแนน คำถามนี้เกี่ยวกับการใช้งานทั่วไปของอัลกอริทึม 2 ไม่ใช่การใช้โดยเฉพาะ
nbro

31

(ฉันทำให้นี่เป็นวิกิของชุมชนโปรดแก้ไข)

ถ้า

  • d
  • ชั่วโมงdชั่วโมง

แล้วก็

  • O(ชั่วโมง)O(ชั่วโมง)
  • O(d)O(d)
  • O(d)O(d)

เหตุผลในการเลือก

  • DFS
    • ต้องดูต้นไม้ทั้งหมดแล้ว
    • d
    • ไม่สนใจว่าคำตอบนั้นใกล้เคียงกับรูตหรือไม่
  • BFS
    • คำตอบอยู่ใกล้กับรูต
    • คุณต้องการคำตอบที่ใกล้เคียงกับรูทมากที่สุด
    • มีหลายแกน / โปรเซสเซอร์
  • IDDFS
    • คุณต้องการ BFS ไม่มีหน่วยความจำเพียงพอ แต่ค่อนข้างช้ากว่าเป็นที่ยอมรับ

IDDFS = การค้นหาความลึกครั้งแรกซ้ำลึก


1
นี่คือคำตอบที่ยอดเยี่ยม ฉันสังเกตว่าในขณะที่คำถามถามเกี่ยวกับกราฟคำตอบนี้หมายถึงต้นไม้ ต้นไม้เป็นกราฟของหลักสูตรและอาจเป็นคำที่สามารถแทนที่ได้ ... แต่วิธีการhคือ "ความสูงของต้นไม้" นั่นแปลโดยตรงกับ "ความสูงของกราฟ" หรือไม่?
user2023370

อีกเหตุผลหนึ่งที่ใช้ IDDFS คือขึ้นอยู่กับว่าคุณต้องการใช้งานอย่างไรหลังจากการวนซ้ำแต่ละครั้งคุณจะได้รับคำตอบที่เป็นไปได้ (ถ้าคุณกำลังค้นหาพูดสูงสุดหรือต่ำสุด) ซึ่งหมายความว่าคุณสามารถออกจากอัลกอริทึมก่อนถ้าคำตอบของคุณ "ดีพอ" หรือคุณสามารถออกจากการป้อนข้อมูลของผู้ใช้ (เช่นเครื่องมือหมากรุกที่ใช้ IDDFS เพื่อหาทางออกที่ดีที่สุด แต่ถูกขัดจังหวะโดยผู้เล่นย้ายชิ้นส่วน)
jedd.ahyoung

อีกจุดหนึ่งที่เพิ่มคือ DFS ใช้กองซ้อนในขณะที่ BFS ใช้คิว
Karthik Balaguru

17

สถานการณ์หนึ่ง (นอกเหนือจากการค้นหาเส้นทางที่สั้นที่สุดซึ่งได้รับการกล่าวถึงแล้ว) ซึ่งคุณอาจต้องเลือกหนึ่งรายการอื่นเพื่อรับโปรแกรมที่ถูกต้องจะเป็นกราฟที่ไม่มีที่สิ้นสุด:

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

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


7
เป็นที่น่าสังเกตว่าทั้งคู่ให้ผลลัพธ์เพียงครึ่งเดียวของอัลกอริธึมสำหรับกราฟที่ไม่มีที่สิ้นสุด คุณไม่สามารถตัดสินใจได้ในเวลาที่แน่นอนว่าองค์ประกอบไม่ได้อยู่ในต้นไม้ (ชัด) สำหรับแอปพลิเคชั่นที่ใช้งานได้โปรดทราบว่าสามารถกำหนดโครงสร้างข้อมูลแบบไม่มีขีด จำกัด (ตามแนวคิด) (ดูย่อหน้าที่ 3.4)
Raphael

15

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

โบนัสที่ดีอย่างหนึ่งของการค้นหาแบบกว้างแรกคือมันจะค้นหาเส้นทางที่สั้นที่สุด

หากอันดับโหนดเฉลี่ยของคุณ (จำนวนเพื่อนบ้าน) สูงเมื่อเทียบกับจำนวนโหนด (เช่นกราฟมีความหนาแน่นสูง) ความกว้างก่อนจะมีคิวมากในขณะที่ความลึกแรกจะมีกองเล็ก ๆ ในกราฟกระจัดกระจายสถานการณ์จะกลับรายการ ดังนั้นหากหน่วยความจำเป็นปัจจัย จำกัด รูปร่างของกราฟในมืออาจต้องแจ้งให้คุณเลือกกลยุทธ์การค้นหา


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

3

ทั้งหมดข้างต้นถูกต้อง แต่ก็น่าสังเกตว่า BFS และ DFS สร้างต้นไม้ของตัวเองตามลำดับที่พวกเขาใช้ในการสำรวจต้นไม้ ต้นไม้แต่ละต้นมีคุณสมบัติเป็นของตัวเองซึ่งสามารถเป็นประโยชน์ในปัญหาบางประเภท

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


1

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

  • ค้นหาสะพานและจุดเชื่อมต่อ (สำหรับกราฟที่ไม่ได้บอกทิศทาง)
  • ตรวจจับรอบ
  • ค้นหาส่วนประกอบที่เชื่อมต่ออย่างยิ่ง (อัลกอริทึมของ Tarjan)

ด้วย BFS คุณสามารถค้นหาเส้นทางที่สั้นที่สุดระหว่างโหนดต้นทางและโหนดอื่น ๆ ในกราฟ

บทกราฟอัลกอริทึมใน CLRS สรุปคุณสมบัติเหล่านี้ของ DFS และ BFS เป็นอย่างดี


-2

ฉันคิดว่ามันน่าสนใจที่จะเขียนทั้งสองอย่างในทางที่เพียงแค่เปลี่ยนโค้ดบางบรรทัดจะให้อัลกอริทึมหนึ่งหรืออีกอันหนึ่งเพื่อที่คุณจะเห็นว่าดิลมาของคุณไม่แข็งแรงอย่างที่คิดในตอนแรก .

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

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

ฉันไม่เห็นการตีความที่เป็นธรรมชาติของ DFS (เฉพาะมาตรฐานเกี่ยวกับเขาวงกต แต่มันไม่ทรงพลังเท่ากับ BFS one และน้ำท่วม) ดังนั้นสำหรับฉันดูเหมือนว่า BFS จะสัมพันธ์กับปรากฏการณ์ทางกายภาพได้ดีกว่าที่อธิบายไว้ข้างต้นในขณะที่ DFS มีความสัมพันธ์ที่ดีขึ้นกับตัวเลือก dillema บนระบบที่มีเหตุผล (เช่นคนหรือคอมพิวเตอร์ตัดสินใจว่าจะย้ายเกมหมากรุกหรือออกไปจากเขาวงกต)

ดังนั้นสำหรับฉันความแตกต่างระหว่างการโกหกซึ่งปรากฏการณ์ทางธรรมชาติที่ดีที่สุดตรงกับรูปแบบการแพร่กระจายของพวกเขา (transversing) ในชีวิตจริง


2
ยินดีต้อนรับสู่เว็บไซต์! อย่างไรก็ตามฉันไม่เห็นจริงๆว่าวิธีนี้ตอบคำถาม ดูเหมือนจะเป็นความรู้สึกและสัญชาติญาณทั่วไปของคุณเกี่ยวกับ BFS และ DFS แต่คำถามไม่ได้ถามถึงความรู้สึกและสัญชาติญาณ: มันถามเกี่ยวกับข้อดีและข้อเสีย ดูเหมือนว่าคำตอบของคุณจะไม่พูดอะไรเลย
David Richerby

ส่วนหนึ่งที่เชื่อมโยงมากที่สุดกับคำถามที่เป็นเรื่องเกี่ยวกับการปรับตัวของอัลกอริทึมที่จะหาต้นไม้ทอดต่ำสุดเส้นทางที่สั้นที่สุดและอื่น ๆ และจะบอกว่าบางปรากฏการณ์ทางธรรมชาติที่มี reproduceable โดย BFS ขณะที่ต้นไม้ตัดสินใจโดย DFS
user5193682

1
คำถามไม่ได้ถามสิ่งที่เกี่ยวข้องกับ BFS และ DFS มันไม่ได้ถามเกี่ยวกับการหาต้นไม้ที่ทอดหรือเส้นทางที่สั้นที่สุดหรือวิธี "สร้างปรากฏการณ์ทางธรรมชาติ"
David Richerby

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