خانه / درس ۵ سطح متوسط: ساختارهای داده پیشرفته در پایتون (Heap, Graph, Trie) درس ۵ سطح متوسط: ساختارهای داده پیشرفته در پایتون (Heap, Graph, Trie) 📅 ۱۴۰۴/۰۹/۰۷ ✍️ سجاد ⌛ 4 دقیقه مطالعه 👁️ 24 پایتون | Python متوسط 🗨️ 🤍 0 📤 0% ‹ بستن لیست دروس بازکردن لیست دروس پایتون | 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) جستجوی کلمات، اتو کامپلیت ۱۲ تمرین آتشین برای تسلط کامل یه Max-Heap با heapq بساز (نکته: از عدد منفی استفاده کن) الگوریتم Heap Sort رو پیادهسازی کن گراف شهرهای ایران بساز و کوتاهترین مسیر رو با BFS پیدا کن الگوریتم DFS رو به صورت غیربازگشتی (با استک) بنویس یه Trie کامل با متدهای جستجو و پیشوند بساز تعداد کلمات با یه پیشوند خاص رو در Trie پیدا کن یه گراف وزندار بساز و الگوریتم دایکسترا رو پیاده کن یه سیستم پیشنهاد دوست در شبکه اجتماعی با گراف بساز یه کیبورد اتو کامپلیت با Trie پیادهسازی کن Heap رو با کلاس کامل و متدها بنویس (نه فقط heapq) یه برنامه پیدا کردن مسیر در迷宫 با BFS بنویس کلاس کامل 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 آپلود کن و منتظر درس بعدی باش. تو داری به قله واقعی برنامهنویسی نزدیک میشی! ← درس قبلی: درس ۴ سطح متوسط: الگوریتمهای بازگشتی (Recursion) و پیشرفته در پایتون درس بعدی: درس ۶ سطح متوسط: طراحی الگوریتم و پیچیدگی زمانی/فضایی + تکنیکهای بهینهسازی در پایتون → برچسبها: BFSdata structuresDFSgraphheapheapqpython advancedtrieآموزش متوسط پایتوناتو کامپلیتالگوریتمپایتونپروژه پایتونپیشنهاد فیلمتریدایکستراساختار داده پیشرفتهشبکه اجتماعیگرافمسیریابیمصاحبه برنامهنویسیهیپ ارسال نظر جدید لغو پاسخ ذخیره نام، ایمیل و وبسایت من در مرورگر برای زمانی که دوباره دیدگاهی مینویسم.
سلام قهرمان پایتون! تبریک میگم که تا درس پنجم سطح متوسط رسیدی. الان دقیقاً توی نقطهای هستی که خیلی از برنامهنویسها سالها طول میکشه بهش برسن. تو این درس قراره با قدرتمندترین و حرفهایترین ساختارهای داده آشنا بشی که توی شرکتهای بزرگ، مصاحبههای شغلی و پروژههای واقعی استفاده میشن: 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) جستجوی کلمات، اتو کامپلیت ۱۲ تمرین آتشین برای تسلط کامل یه Max-Heap با heapq بساز (نکته: از عدد منفی استفاده کن) الگوریتم Heap Sort رو پیادهسازی کن گراف شهرهای ایران بساز و کوتاهترین مسیر رو با BFS پیدا کن الگوریتم DFS رو به صورت غیربازگشتی (با استک) بنویس یه Trie کامل با متدهای جستجو و پیشوند بساز تعداد کلمات با یه پیشوند خاص رو در Trie پیدا کن یه گراف وزندار بساز و الگوریتم دایکسترا رو پیاده کن یه سیستم پیشنهاد دوست در شبکه اجتماعی با گراف بساز یه کیبورد اتو کامپلیت با Trie پیادهسازی کن Heap رو با کلاس کامل و متدها بنویس (نه فقط heapq) یه برنامه پیدا کردن مسیر در迷宫 با BFS بنویس کلاس کامل 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 آپلود کن و منتظر درس بعدی باش. تو داری به قله واقعی برنامهنویسی نزدیک میشی! ← درس قبلی: درس ۴ سطح متوسط: الگوریتمهای بازگشتی (Recursion) و پیشرفته در پایتون درس بعدی: درس ۶ سطح متوسط: طراحی الگوریتم و پیچیدگی زمانی/فضایی + تکنیکهای بهینهسازی در پایتون → برچسبها: BFSdata structuresDFSgraphheapheapqpython advancedtrieآموزش متوسط پایتوناتو کامپلیتالگوریتمپایتونپروژه پایتونپیشنهاد فیلمتریدایکستراساختار داده پیشرفتهشبکه اجتماعیگرافمسیریابیمصاحبه برنامهنویسیهیپ