คุณได้รับ DFS หรือไม่หากคุณเปลี่ยนคิวเป็นสแต็กในการนำไปใช้งาน BFS


35

นี่คือรหัสเทียมมาตรฐานสำหรับการค้นหาแบบกว้างครั้งแรก:

{ seen(x) is false for all x at this point }
push(q, x0)
seen(x0) := true
while (!empty(q))
  x := pop(q)
  visit(x)
  for each y reachable from x by one edge
    if not seen(y)
      push(q, y)
      seen(y) := true

ที่นี่pushและpopจะถือว่าเป็นการดำเนินการคิว แต่ถ้าพวกมันเป็นการทำงานแบบกองซ้อน? อัลกอริทึมที่ได้จะไปที่จุดยอดตามลำดับความลึกก่อนหรือไม่


หากคุณโหวตให้ความคิดเห็นว่า "นี่มันเล็กน้อย" ฉันขอให้คุณอธิบายว่าทำไมมันถึงสำคัญ ฉันพบปัญหาค่อนข้างยุ่งยาก


5
ฉันเห็นนักเรียนต่อสู้กับสิ่งนี้ดังนั้นฉันจึงไม่คิดว่ามันจะง่ายเกินไป อย่างไรก็ตามคำตอบควรมีอะไรมากกว่า "ใช่" หรือ "ไม่" ความละเอียดที่ต้องการไม่ชัดเจนจากคำถาม
Raphael

2
"ใช่" จะมาพร้อมกับข้อโต้แย้งที่น่าเชื่อ; "ไม่" จะมาพร้อมกับตัวอย่าง แต่มีคำตอบที่ดีกว่าใช่ / ไม่ใช่เมื่อคุณเข้าใจสิ่งที่เกิดขึ้น ...
rgrig


3
มีความเป็นไปได้ที่จะเขียนโค้ดหลอกเพื่อให้เพียงแค่เปลี่ยนpopเป็นสแต็กหรือการดำเนินการคิวเราได้รับ dfs หรือ bfs นอกจากนี้ยังง่ายต่อการเขียนโค้ดหลอกซึ่งในตอนแรกจะปรากฏว่านี่เป็นเรื่องจริง แต่ไม่ใช่ ics.uci.edu//~eppstein/161/960215.html เป็นข้อมูลอ้างอิงที่เกี่ยวข้อง
Joe

คำตอบ:


23

ไม่สิ่งนี้ไม่เหมือนกับ DFS

พิจารณากราฟ

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

หากคุณกดโหนดในลำดับจากขวาไปซ้ายอัลกอริทึมจะให้การแวะผ่าน:

A,B,E,C,D

ในขณะที่ DFS คาดว่าจะเป็น

A,B,E,D,C

ปัญหานี้เกิดขึ้นเนื่องจากคุณทำเครื่องหมายว่าเห็นเมื่อถึงเวลาผลักดันแทนที่จะเป็นเวลาเยี่ยมชม เป็นแหลมออกในความคิดเห็นที่ถ้าคุณทำเครื่องหมายในช่วงเวลาของการเยี่ยมชมที่ต้องการพื้นที่ของคุณอาจจะไปถึงมากกว่า(V)O ( V )Θ(V+E)O(V)

ฉันเห็นด้วยกับปัญหาไม่ได้เป็นเรื่องเล็กน้อย


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

3
@rgrig: เอาละนี่เป็นหนึ่งใน traversals ที่เป็นไปได้และนั่นนำไปสู่ลำดับที่ไม่ได้อยู่ใน DFS ไม่ว่าคุณจะทำซ้ำอย่างไรการทำเครื่องหมายตามที่เห็นจะส่งผลให้ DFS 'ด้านล่าง'ออกมาผิดถ้าคุณไม่ได้ไปที่ก่อน E DDED
Aryabhata

1
@ Arybhata: โอ้ขอโทษฉันไม่ทราบว่าทำไมฉันจึงสันนิษฐานว่าคุณหมายถึงขอบที่จะนำและชี้ลง พวกมันไม่ได้บอกทิศทางดังนั้นคุณพูดถูก: นี่คือตัวอย่างที่ดีแม้กระทั่งสิ่งที่ฉันพูดในความคิดเห็น (นี่คือแปลก: ฉันต้องสะกดจับของคุณดังนั้นจึงไม่ได้ถูกลบโดย SE.)
rgrig
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.