مقدمه
در دنیای محاسبات، الگوریتم (Algorithm) تنها یک تکه کد نیست؛ بلکه منطقی است که پشت هر نوآوری دیجیتال قرار دارد. از موتورهای جستجو گرفته تا سیستمهای مسیریابی، همگی بر پایه الگوهای ریاضی و منطقی بنا شدهاند.
۱. تحلیل کارایی: پیچیدگی زمانی (Time Complexity)
قبل از پیادهسازی هر الگوریتم، باید بدانیم چقدر "سریع" است. ما این کار را با Big O Notation انجام میدهیم. این نماد نشان میدهد که با بزرگ شدن ورودی ($n$)، زمان اجرای الگوریتم چگونه تغییر میکند.
- $O(1)$ (زمان ثابت): عملیاتی که فارغ از اندازه داده، همیشه یک زمان مشخص میبرد (مثل دسترسی به یک عنصر آرایه با ایندکس).
- $O(\log n)$ (لگاریتمی): بسیار کارآمد؛ با دو برابر شدن داده، زمان فقط یک واحد افزایش مییابد (مثل جستجوی دودویی).
- $O(n)$ (خطی): زمان مستقیماً با تعداد دادهها زیاد میشود (مثل جستجوی ساده در یک لیست).
- $O(n \log n)$: استاندارد طلایی برای الگوریتمهای مرتبسازی بهینه.
- $O(n^2)$ (مربعی): معمولاً در حلقههای تو در تو دیده میشود و برای دادههای بزرگ فاجعهبار است.
۲. الگوریتمهای مرتبسازی (Sorting)
مرتبسازی دادهها یکی از بنیادیترین عملیاتها در علوم کامپیوتر است.
الف) مرتبسازی ادغامی (Merge Sort)
این الگوریتم از استراتژی "تقسیم و غلبه" (Divide and Conquer) استفاده میکند.
- روش کار: لیست را به دو نیم تقسیم میکند، هر نیمه را به صورت بازگشتی مرتب میکند و سپس دو نیمه مرتب شده را با هم ادغام میکند.
- پیچیدگی زمانی: در تمام حالات (بهترین، متوسط، بدترین) برابر با $O(n \log n)$ است.
- نکته مثبت: بسیار پایدار است و برای دادههای حجیم عالی عمل میکند.
ب) مرتبسازی سریع (Quick Sort)
این الگوریتم نیز از "تقسیم و غلبه" استفاده میکند اما با رویکردی متفاوت.
- روش کار: یک عنصر به نام Pivot (محور) انتخاب میشود. دادهها به دو دسته (کوچکتر از محور و بزرگتر از محور) تقسیم میشوند و این روند تکرار میگردد.
- پیچیدگی زمانی: در حالت متوسط $O(n \log n)$ اما در بدترین حالت (اگر محور بد انتخاب شود) به $O(n^2)$ میرسد.
- نکته مثبت: به دلیل ضریب ثابت کوچک، معمولاً در عمل سریعتر از Merge Sort است و حافظه کمتری مصرف میکند.
۳. پیمایش و جستجو در گراف (Graph Traversal)
گرافها برای نمایش شبکه دوستان، نقشهها و ساختارهای وب استفاده میشوند.
الف) جستجوی اول سطح (BFS - Breadth-First Search)
- استراتژی: لایه به لایه حرکت میکند. ابتدا تمام همسایگان مستقیم یک گره را میبیند، سپس سراغ همسایگانِ همسایگان میرود.
- ساختمان داده: از صف (Queue) استفاده میکند.
- کاربرد: یافتن کوتاهترین مسیر در گرافهای بدون وزن (مثلاً پیدا کردن کمترین تعداد واسطه بین دو نفر در لینکدین).
ب) جستجوی اول عمق (DFS - Depth-First Search)
- استراتژی: تا جایی که راه دارد در یک شاخه به عمق میرود و وقتی به بنبست رسید، عقبگرد (Backtrack) میکند.
- ساختمان داده: از پشته (Stack) یا بازگشت (Recursion) استفاده میکند.
- کاربرد: حل معماها (مثل ماز)، تشخیص دور در گراف و زمانبندی کارها.
۴. برنامهنویسی پویا (Dynamic Programming)
این روش برای حل مسائل بهینهسازی بسیار پیچیده به کار میرود. ایده اصلی این است: "آینده را با استفاده از نتایج گذشته بساز."
الف) مفهوم اصلی
اگر یک مسئله به زیرمسئلههای تکراری تقسیم شود، ما جواب هر زیرمسئله را یکبار محاسبه و در یک جدول ذخیره میکنیم (Memoization) تا دوبارهکاری نشود.
ب) اعداد فیبوناچی (Fibonacci)
در حالت عادی (بازگشتی ساده)، محاسبه عدد ۵۰ فیبوناچی ممکن است دقیقهها طول بکشد چون محاسبات تکراری زیادی انجام میدهد ($O(2^n)$).
- با DP: ما مقادیر قبلی را ذخیره میکنیم و در زمان $O(n)$ به جواب میرسیم.
ج) مسئله کولهپشتی (Knapsack Problem)
یکی از معروفترین مسائل بهینهسازی است.
- صورت مسئله: شما یک کولهپشتی با ظرفیت محدود دارید و تعدادی کالا با وزنها و ارزشهای مختلف. کدام کالاها را بردارید تا بیشترین ارزش ممکن را داشته باشید؟
- راه حل DP: با ایجاد یک جدول دو بعدی، تمام ترکیبهای ممکن وزن و کالا را بررسی کرده و بهترین انتخاب را در هر مرحله ذخیره میکنیم. این مسئله با روشهای ساده قابل حل بهینه نیست.
۵. خلاصه مقایسهای الگوریتمها
| الگوریتم | استراتژی | پیچیدگی زمانی (متوسط) | کاربرد کلیدی |
|---|---|---|---|
| Merge Sort | تقسیم و غلبه | $O(n \log n)$ | مرتبسازی دادههای بزرگ و پایدار |
| Quick Sort | تقسیم و غلبه | $O(n \log n)$ | مرتبسازی سریع در حافظه (In-place) |
| BFS | پیمایش لایهای | $O(V + E)$ | یافتن کوتاهترین مسیر |
| DFS | پیمایش عمیق | $O(V + E)$ | حل معما و توپولوژی |
| Knapsack (DP) | بهینهسازی پویا | $O(n \cdot W)$ | تخصیص منابع و بودجهبندی |
نتیجهگیری
تسلط بر الگوریتمها تفاوت میان یک برنامه که "فقط کار میکند" و برنامهای که "مقیاسپذیر و سریع است" را مشخص میکند. درک Merge Sort و Quick Sort به شما دید عمیقی درباره مدیریت داده میدهد، BFS/DFS منطق شبکهها را روشن میکند و Dynamic Programming قدرت حل سختترین چالشهای منطقی را به شما میبخشد.