0%
در حال بارگذاری...

جستجو در سایت

درس ۵ سطح متوسط: ساختارهای داده پیشرفته در پایتون (Heap, Graph, Trie)

پایتون | Python متوسط

سلام قهرمان پایتون! تبریک می‌گم که تا درس پنجم سطح متوسط رسیدی. الان دقیقاً توی نقطه‌ای هستی که خیلی از برنامه‌نویس‌ها سال‌ها طول می‌کشه بهش برسن. تو این درس قراره با قدرتمندترین و حرفه‌ای‌ترین ساختارهای داده آشنا بشی که توی شرکت‌های بزرگ، مصاحبه‌های شغلی و پروژه‌های واقعی استفاده می‌شن: Heap، Graph و Trie. وقتی این درس تموم بشه، تو دیگه فقط یه برنامه‌نویس پایتون نیستی – یه مهندس داده و الگوریتم واقعی می‌شی که می‌تونه مسائل پیچیده رو با کمترین زمان و حافظه حل کنه. اگه درس‌های قبلی (مخصوصاً لیست، دیکشنری، شیءگرایی و بازگشتی) رو خوب بلدی، الان بهترین زمانه که وارد دنیای حرفه‌ای‌ها بشی. آماده‌ای؟ بریم که یه سطح کاملاً جدید از مهارت رو به دست بیاری!

چرا ساختارهای داده پیشرفته پایتون اینقدر مهمن؟

لیست و دیکشنری برای کارهای معمولی عالی هستن، اما وقتی با میلیون‌ها داده کار می‌کنی یا نیاز به سرعت بالا داری، این ساختارهای پیشرفته وارد می‌شن. مثلاً:

  • Heap → برای اولویت‌بندی کارها (مثل تسک منیجر)
  • Graph → برای شبکه‌های اجتماعی، نقشه، مسیریابی
  • Trie → برای جستجوی سریع کلمات (مثل کیبورد گوشی)

۱. Heap (کپه) – اولویت همیشه اول!

Heap یه درخت باینری خاصه که همیشه ریشه بزرگ‌ترین یا کوچک‌ترین عنصر رو داره. پایتون با ماژول heapq این کار رو خیلی ساده کرده.

import heapq

# Min-Heap (کوچک‌ترین اول)
heap = []
heapq.heappush(heap, 5)
heapq.heappush(heap, 1)
heapq.heappush(heap, 9)
heapq.heappush(heap, 3)

print(heapq.heappop(heap))  # خروجی: ۱
print(heapq.heappop(heap))  # خروجی: ۳
مثال واقعی: مدیریت وظایف با اولویت
tasks = []
heapq.heappush(tasks, (3, "تمرین پایتون"))
heapq.heappush(tasks, (1, "خرید نون"))
heapq.heappush(tasks, (2, "تماس با مامان"))

while tasks:
    priority, task = heapq.heappop(tasks)
    print(f"اولویت {priority}: {task}")

۲. Graph (گراف) – دنیای ارتباطات

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

class Graph:
    def __init__(self):
        self.graph = {}
    
    def add_edge(self, u, v):
        if u not in self.graph:
            self.graph[u] = []
        self.graph[u].append(v)
        # برای گراف بدون جهت:
        if v not in self.graph:
            self.graph[v] = []
        self.graph[v].append(u)

g = Graph()
g.add_edge("علی", "مریم")
g.add_edge("علی", "رضا")
g.add_edge("مریم", "سارا")
print(g.graph)
پیمایش گراف: DFS و BFS
def dfs(graph, start, visited=None):
    if visited is None:
        visited = set()
    visited.add(start)
    print(start)
    for neighbor in graph.get(start, []):
        if neighbor not in visited:
            dfs(neighbor, visited)

dfs(g.graph, "علی")

۳. Trie (تری) – جستجوی کلمات در چند میلی‌ثانیه!

Trie یه درخت مخصوص رشته‌هاست که هر حرف یه شاخه‌ست. برای دیکشنری، اتو کامپلیت و جستجوی سریع عالیه.

class TrieNode:
    def __init__(self):
        self.children = {}
        self.is_end = False

class Trie:
    def __init__(self):
        self.root = TrieNode()
    
    def insert(self, word):
        node = self.root
        for char in word:
            if char not in node.children:
                node.children[char] = TrieNode()
            node = node.children[char]
        node.is_end = True
    
    def search(self, word):
        node = self.root
        for char in word:
            if char not in node.children:
                return False
            node = node.children[char]
        return node.is_end

trie = Trie()
trie.insert("سلام")
trie.insert("سلامتی")
print(trie.search("سلام"))    # True
print(trie.search("خداحافظ")) # False

مقایسه ساختارهای داده پیشرفته پایتون

ساختار زمان درج زمان جستجو کاربرد اصلی
Heap O(log n) O(1) برای min/max الگوریتم دایکسترا، اولویت
Graph O(1) O(V+E) شبکه‌های اجتماعی، نقشه
Trie O(m) O(m) جستجوی کلمات، اتو کامپلیت

۱۲ تمرین آتشین برای تسلط کامل

  1. یه Max-Heap با heapq بساز (نکته: از عدد منفی استفاده کن)
  2. الگوریتم Heap Sort رو پیاده‌سازی کن
  3. گراف شهرهای ایران بساز و کوتاه‌ترین مسیر رو با BFS پیدا کن
  4. الگوریتم DFS رو به صورت غیربازگشتی (با استک) بنویس
  5. یه Trie کامل با متدهای جستجو و پیشوند بساز
  6. تعداد کلمات با یه پیشوند خاص رو در Trie پیدا کن
  7. یه گراف وزن‌دار بساز و الگوریتم دایکسترا رو پیاده کن
  8. یه سیستم پیشنهاد دوست در شبکه اجتماعی با گراف بساز
  9. یه کیبورد اتو کامپلیت با Trie پیاده‌سازی کن
  10. Heap رو با کلاس کامل و متدها بنویس (نه فقط heapq)
  11. یه برنامه پیدا کردن مسیر در迷宫 با BFS بنویس
  12. کلاس کامل Graph با متدهای اضافه کردن راس و یال و پیمایش

پروژه نهایی درس: سیستم پیشنهاد فیلم با گراف

class MovieRecommender:
    def __init__(self):
        self.graph = {}
    
    def add_user(self, user):
        self.graph[user] = {}
    
    def add_rating(self, user, movie, rating):
        if user not in self.graph:
            self.add_user(user)
        self.graph[user][movie] = rating
    
    def suggest(self, user, threshold=4):
        suggestions = {}
        friends = self.graph[user].keys()
        
        for friend in friends:
            for movie, rating in self.graph[friend].items():
                if movie not in self.graph[user] and rating >= threshold:
                    suggestions[movie] = suggestions.get(movie, 0) + rating
        
        return sorted(suggestions.items(), key=lambda x: x[1], reverse=True)[:5]

recommender = MovieRecommender()
recommender.add_rating("علی", "تایتانیک", 5)
recommender.add_rating("علی", "ماتریکس", 4)
recommender.add_rating("مریم", "تایتانیک", 3)
recommender.add_rating("مریم", "اینسپشن", 5)

print("پیشنهاد برای علی:", recommender.suggest("علی"))

جمع‌بندی و قدم بعدی

تبریک می‌گم! تو الان رسماً با قوی‌ترین ساختارهای داده دنیا آشنا شدی. این دانش توی مصاحبه‌های شغلی، پروژه‌های بزرگ و حتی المپیاد برنامه‌نویسی برات درخشش میاره. درس بعدی قراره درباره طراحی الگوریتم و بهینه‌سازی پیچیدگی زمانی و فضایی باشه. تمرین‌ها رو انجام بده، پروژه رو توی GitHub آپلود کن و منتظر درس بعدی باش. تو داری به قله واقعی برنامه‌نویسی نزدیک می‌شی!

ارسال نظر جدید

گزارش دیدگاه