เมื่อพูดถึงการค้นหาข้อมูลในโครงสร้างข้อมูลอย่างกราฟ (Graphs) หรือต้นไม้ (Trees), อัลกอริทึมที่หลีกเลี่ยงไม่ได้คือ Depth First Search หรือ DFS ซึ่งเป็นวิธีค้นหาที่เน้นการดำดิ่งไปในทิศทางลึกของ nodes ก่อน ในทุกกรณีที่สามารถยังคงดำดิ่งลงไปได้ ก่อนที่จะย้อนกลับหาทางเลือกอื่นๆ ต่อไป อัลกอริทึมนี้เหมาะสมกับการแสวงหาเส้นทาง, สร้างต้นไม้แบบขยายทั้งหมด, และใช้กับโครงสร้างที่มีการเชื่อมโยงลึกและซับซ้อนอย่างเช่นเกมปริศนาหรือการนำทางไฟล์ในระบบคอมพิวเตอร์
Perl เป็นภาษาที่เหมาะสมมากสำหรับการทดลองกับ algorithm ต่างๆ เพราะความสามารถของการจัดการตัวแปรที่มีความยืดหยุ่น และระบบ regular expressions ที่แข็งแกร่ง ดังนั้น เราจะดูตัวอย่างโค้ดของ DFS ที่เขียนด้วย Perl:
sub depth_first_search {
my ($node, $visited, $graph) = @_;
# บันทึกว่าได้เยี่ยม node นี้แล้ว
$visited->{$node}++;
# ทำการเยี่ยมชมลูกของ node นี้
foreach my $neighbour ( @{ $graph->{$node} } ) {
next if $visited->{$neighbour};
depth_first_search($neighbour, $visited, $graph);
}
}
# สร้างกราฟในรูปแบบของ hash reference
my $graph = {
A => ['B', 'C'],
B => ['D', 'E'],
C => ['F', 'G'],
D => [],
E => ['H'],
F => [],
G => ['I', 'J'],
H => [],
I => [],
J => []
};
# คำนวณการเยี่ยมชมโดยใช้ DFS
my $visited = {};
depth_first_search('A', $visited, $graph);
# พิมพ์ผลลัพธ์
foreach my $node (keys %$visited) {
print "$node\n";
}
Time Complexity
ของการทำงาน DFS อยู่ที่ O(V + E) เมื่อ V คือจำนวน vertices และ E คือจำนวน edges ในกราฟ. นั่นหมายความว่า DFS จะทำงานได้อย่างรวดเร็วทีเดียวกับกราฟที่มีขนาดไม่ใหญ่มากนัก และขอบเขตของการค้นหาไม่กว้างเกินไป.
ข้อดี:
- ใช้ Memory น้อย เนื่องจากไม่จำเป็นต้องจดจำทุกระดับของโน้ดที่เยี่ยมชม
- สามารถใช้เพื่อค้นหาเส้นทางหรือโซลูชันที่สามารถดำดิ่งลงไปได้น้อยที่สุด
- ง่ายต่อการโปรแกรมและเข้าใจ
ข้อเสีย:
- อาจไม่เหมาะกับกราฟที่มีขนาดใหญ่ หรือมีการเชื่อมโยงที่ซับซ้อนมากระดับหนึ่ง
- DFS ไม่ได้รับประกันว่าจะคืนผลลัพธ์ที่ดีที่สุดหรือเส้นทางที่สั้นที่สุด
- สามารถติด Loop หรือเข้าสู่สภาวะเรียกซ้ำไร้จุดสิ้นสุดได้หากไม่ได้ดูแลการเยี่ยมชมโน้ดอย่างรอบคอบ
ในโลกจริง, DFS มีการประยุกต์ใช้มากมาย เช่น ในการประมวลผลโดยใช้ recursive function calls เพื่อทำความเข้าใจกับโปรแกรมที่มีโครงสร้างซับซ้อน ในการออกแบบเกมสำหรับการค้นหาเส้นทางหรือการแก้ปริศนา เช่น ลำดับไปยังจุดหมายที่มีความซับซ้อน หรือที่เราเรียกว่า puzzles solving algorithms นอกจากนี้ยังมีในการค้นหาไฟล์ในระบบไฟล์ของคอมพิวเตอร์ หรือการวิเคราะห์เครือข่ายสังคมซึ่งมีการจำลองความเกี่ยวพันที่ซับซ้อนของบุคคลหรือกลุ่มบุคคลต่างๆ
การเรียนรู้ DFS เป็นการลงทุนทางความคิดที่จะเปิดประตูสู่การเข้าใจโครงสร้างข้อมูลและอัลกอริทึมยิ่งขึ้นอีกขั้นหนึ่ง ที่ EPT, เรามุ่งมั่นที่จะให้ความรู้และทักษะในการเขียนโปรแกรมเพื่ออนาคตที่สดใส เพราะการได้ลงมือทำจริงด้วยตัวคุณเองคือก้าวแรกของการเป็นนักพัฒนาซอฟต์แวร์ระดับโลก เริ่มต้นการเดินทางทางความคิดนี้ไปกับเราที่ EPT และค้นพบความไม่สิ้นสุดในโลกของการเขียนโปรแกรม!
หมายเหตุ: ข้อมูลในบทความนี้อาจจะผิด โปรดตรวจสอบความถูกต้องของบทความอีกครั้งหนึ่ง บทความนี้ไม่สามารถนำไปใช้อ้างอิงใด ๆ ได้ ทาง EPT ไม่ขอยืนยันความถูกต้อง และไม่ขอรับผิดชอบต่อความเสียหายใดที่เกิดจากบทความชุดนี้ทั้งทางทรัพย์สิน ร่างกาย หรือจิตใจของผู้อ่านและผู้เกี่ยวข้อง
Tag ที่น่าสนใจ: perl depth_first_search algorithm graphs trees programming recursive_function data_structure code_example complexity_analysis
หากมีข้อผิดพลาด/ต้องการพูดคุยเพิ่มเติมเกี่ยวกับบทความนี้ กรุณาแจ้งที่ http://m.me/Expert.Programming.Tutor
085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM