python, پایتون, ساختمان داده در پایتون, گراف در پایتون

جستجوی اول عمق در پایتون

جستجوی اول عمق در پایتون

در این آموزش تیم کدگیت را با توضیح جستجوی اول عمق در پایتون همراهی کنید. در ابتدای جلسه جستجوی اول عمق را توضیح، سپس به پیاده‌سازی آن در پایتون خواهیم پرداخت. پیش‌نیاز این آموزش شامل موارد زیر می‌باشد:

جستجوی اول عمق

در نظریه‌ گراف، جستجوی عمق اول یک الگوریتم پیمایش گراف است که برای پیمایش یا جستجوی یک درخت یا یک گراف به کار می‌رود.استراتژی جستجوی عمق اول برای پیمایش گراف، همانطور که از نامش پیداست “جستجوی عمیق‌تر در گراف تا زمانی که امکان دارد” است.

الگوریتم از ریشه شروع می‌کند (در گراف‌ها و یا درخت‌های بدون ریشه راس دلخواهی به عنوان ریشه انتخاب می‌شود) و در هر مرحله همسایه‌های رأس جاری را از طریق یال‌های خروجی رأس جاری به ترتیب بررسی کرده و به محض روبه‌رو شدن با همسایه‌ای که قبلاً دیده نشده باشد، به صورت بازگشتی برای آن رأس به عنوان رأس جاری اجرا می‌شود. در صورتی که همه همسایه‌ها قبلاً دیده شده باشند، الگوریتم عقب‌گرد می‌کند و اجرای الگوریتم برای رأسی که از آن به رأس جاری رسیده‌ایم، ادامه می‌یابد. به عبارتی الگوریتم تا آنجا که ممکن است، به عمق بیشتر و بیشتر می‌رود و در مواجهه با بن بست عقب‌گرد می‌کند. این فرایند تا زمانی که همه ی رأس‌های قابل دستیابی از ریشه دیده شوند ادامه می‌یابد.

جستجوی اول عمق در پایتون

پیاده سازی جستجوی اول عمق در پایتون

در آموزش گذشته پیاده سازی گراف را انجام داده‌ایم و از همان پیاده‌سازی برای این آموزش استفاده می‌شود. کد گرافی که در جلسه گذشته پیاده سازی کردیم به صورت زیر است:

from collections import defaultdict 
class UnDirectedGraph: 
     # Constructor 
    def __init__(self): 
  
        # default dictionary to store graph 
        self.graph = defaultdict(list)
        self.E = 0 
  
    # function to add an edge to graph 
    def addEdge(self,u,v): 
        if v in self.graph[u]:
            return 
        if u == v:
            self.graph[u].append(v)
            return
        
        self.graph[u].append(v)
        self.graph[v].append(u)
        self.E+=1 
    def V(self):
        return len(self.graph)
    def Edge(self):
        return self.E
    
    def printGraph(self):
        for i in self.graph: 
            print(i,':',end=' ')
            for j in self.graph[i]:
                print(j, end= ' ')
            print()

برای پیاده سازی جستجوی اول عمق در پایتون از ساختار داده Set استفاده می‌کنیم. یک متد با نام DFS ایجاد می‌کنیم. ورودی این متد گره ریشه و مجموعه Set می‌باشد. در صورتی که گره‌ای را بررسی کردیم مقدار آن در set ذخیره می‌شود. کد این قسمت به صورت زیر است:

def DFS(self, s, visited = set()):

حال نوبت به پیاده سازی الگوریتم می‌رسد. ابتدا گره ورودی متد DFS را وارد متغیر Visited می‌کنیم:

        visited.add(s)
        print(s, end=' ')

در پایان الگوریتم تمام گره‌های متصل به s را به صورت بازگشتی صدا زده و متد DFS را بر روی آن‌ها اجرا می‌کنیم:

        for neighbour in self.graph[s]:
            if neighbour not in visited:
                self.DFS(neighbour, visited)   

تست جستجوی اول عمق در پایتون

برای تست کدهای بالا، main زیر را اجرا کنید:

if __name__ == '__main__':
    g = UnDirectedGraph()
    g.addEdge(0, 1) 
    g.addEdge(0, 4) 
    g.addEdge(1, 4) 
    g.addEdge(1, 3) 
    g.addEdge(1, 2) 
    g.addEdge(2, 3) 
    g.addEdge(3, 4) 
    print('print Graph:')
    g.printGraph()
    print('DFS',end=' ')
    g.DFS(2)

در کد بالا ابتدا گراف را ایجاد کرده سپس بر روی گره 2 جسجوی اول عمق را اجرا کردیم. گراف ورودی به صورت زیر می‌باشد:

جستجوی اول عمق در پایتون

خروجی برنامه نیز به صورت زیر است:

print Graph:

0 : 1 4

1 : 0 4 3 2

4 : 0 1 3

3 : 1 2 4

2 : 1 3

DFS 2 1 0 4 3

ویدئو آموزش

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *