آموزش الگوریتم نویسی – مفاهیم پایه به زبان ساده

۱۳۷ بازدید
آخرین به‌روزرسانی: ۲۹ بهمن ۱۴۰۳
زمان مطالعه: ۱۵ دقیقه
دانلود PDF مقاله
آموزش الگوریتم نویسی – مفاهیم پایه به زبان سادهآموزش الگوریتم نویسی – مفاهیم پایه به زبان ساده

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

997696

در مطلب حاضر و با هدف آموزش الگوریتم نویسی، تلاش کردیم به مخاطبان خود بهترین و کامل‌ترین روش طراحی الگوریتم را یاد بدهیم. در بخش اول به صورت خلاصه و مفید تمام مراحل الگوریتم نویسی را نام‌ برده و برای هرکدام توضیح کوتاهی نوشتیم. سپس در ادامه این مراحل را توضیح داده و با کمک مثال خوبی فرایند الگوریتم نویسی را به صورت عملی پیاده‌سازی کرده‌ایم.

الگوریتم نویسی چه مراحلی دارد؟

الگوریتم نویسی شامل چند مرحله است که باید به صورت دقیق و منظم، پشت سر هم اجرا شوند. از آنجا که هدف این مطلب، آموزش الگوریتم نویسی است، بهترین روش نوشتن الگوریتم را همراه با مثال مناسب توضیح داده‌ایم.

در فهرست زیر تمام مراحل اصلی نوشتن الگوریتم به ترتیب، نوشته شده‌اند.

  1. درک کامل و صحیح مسئله: در بخش اول، ابتدا باید هدف مسئله را درک کرده و سپس داده‌های ورودی، خروجی و محدودیت‌های عملیاتی فرایند را شناسایی کنیم.
  2. تحلیل مسئله و تجزیه آن به بخش‌های کوچک‌تر: در این مرحله اول نوع مسئله را تشخیص می‌دهیم. سپس باید الگو‌های تکراری درون مسئله و حالت‌های خاص آن را شناسایی کنیم.
  3. طراحی استراتژی: برای طراحی الگوریتم لازم است که ساختمان داده مناسب و متدهای الگوریتمی صحیحی را انتخاب کنیم.
  4. نوشتن شبه کد: در مرحله چهارم، تمام مراحل اجرای کار الگوریتم را با کمک نوشتن «شبه کد» (Pseudocode) به صورت منظم و خوانا مستند می‌کنیم.
  5. کدنویسی الگوریتم در زبان برنامه نویسی مورد نظر: اکنون باید، شبه کد نوشته شده را به کدهای واقعی تبدیل کنیم. بسیار مهم است که کدهای نوشته شده تمیز و خوانا باشند.
  6. آزمایش و تایید کیفیت کار الگوریتم: الگوریتم خود را با داده‌های ورودی مختلفی اجرا می‌کنیم. حتما باید داده‌های ورودی خاص و استثنایی را هم آزمایش کنیم.
  7. تحلیل و بهینه‌سازی الگوریتم: در این مرحله، میزان پیچیدگی‌های زمانی و فضایی الگوریتم را محاسبه می‌کنیم. در صورتی که نیاز شد باید فرایند کار الگوریتم را بهینه‌سازی کرده و عملکرد آن‌ را ارتقا دهیم.
  8. اصلاح و مستندسازی الگوریتم: ساختار کدها را ارتقا داده و کامنت‌های با معنی به کدها اضافه می‌کنیم.
  9. تمرین و یادگیری مداوم: برای حرفه‌ای شدن در الگوریتم نویسی، باید به شکل منظم مسائل مختلف الگوریتمی حل کنیم.
  10. بررسی بازخورد‌ها و تکرار مجدد فرایند: باید با دیگران برای بازبینی الگوریتم‌های نوشته شده و ارتقای عملکرد آن‌ها همفکری کنیم.

برای طراحی و نوشتن صحیح الگوریتم باید تمام مراحل بالا را به دقت و یک به یک اجرا کنیم. در ادامه مطلب تمام مراحل بالا را یک به یک توضیح داده‌ایم.

۱. درک کامل و صحیح مسئله

مهم‌ترین بخشی که در آموزش الگوریتم نویسی باید بر روی آن تاکید کرد درک کامل و صحیح مسئله است.

برای رسیدن به چنین درکی از روش‌های زیر استفاده می‌کنیم.

  1. مسئله را با دقت مطالعه کنید: قبل از حل مسئله باید بفهمیم که سوال چیست. در زمان مطالعه مسئله، تمام محدودیت‌ها یا شرایط خاص را یاد داشت می‌کنیم.
  2. مقادیر ورودی و خروجی را شناسایی کنید: باید با دقت نوع، شکل و محدوده داده‌ها را شناسایی کنیم. بعد از آن هم لازم است که داده‌های خروجی از مسئله را به خوبی شناسایی و تعریف کنیم.
  3. بررسی مثال‌ها: در این بخش به صورت دستی مسئله را با داده‌های نمونه‌ به عنوان ورودی حل می‌کنیم. چند مورد آزمایشی دیگر هم با داده‌های خاص در مسئله تهیه می‌کنیم. به عنوان مثالی از داده‌های خاص می‌توان به مقدار خالی یا مقدارهای خیلی بزرگ به عنوان ورودی اشاره کرد.
مرحله اول درک کامل و صحیح مسئله
مرحله اول درک کامل و صحیح مسئله

مثالی برای الگوریتم نویسی

فرض کنیم که مسئله داده شده می‌خواهد طولانی‌ترین زیررشته پالیندروم را در داخل رشته‌ داده شده پیدا کنیم. در این مسئله رشته‌ای به عنوان رشته‌ اصلی داده شده است. باید از درون رشته اصلی، زیررشته‌ پالیندروم با بیشترین کاراکتر را شناسایی کنیم. در ادامه همین بخش از مطلب آموزش الگوریتم نویسی، رشته پالیندروم را به شکل خلاصه و کامل معرفی کرده‌ایم.

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

  • هدف: شناسایی طولانی‌ترین زیر رشته‌ای که از ابتدا و انتها به یک شکل خوانده می‌شود.
  • مقدار ورودی: رشته‌ای با نام فرضی s
  • مقدار خروجی: طولانی‌ترین زیر رشته پالیندورمی درون رشته s
  • محدودیت‌ها: طول رشته اصلی از ۱ تا ۱۰۰۰ کاراکتر، متغیر است. این رشته ممکن است هم شامل کاراکترهای حروف بزرگ و هم شامل حروف کوچک انگلیسی باشد.

رشته پالیندورم چیست؟

رشته پالیندروم به مجموعه‌ای از کاراکترها گفته می‌‌شود که از هر دو سمت ابتدا و انتها به یک شکل خوانده می‌شود. برای مثال می‌توان به کلمات «گرگ» و «درد» در فارسی و کلمات «Mom» و «Dad» در انگلیسی اشاره کرد. این رشته‌ها می‌توانند هم شامل تعداد کاراکترهای فرد باشند و هم شامل تعدادی کاراکترهای زوج. به عنوان مثالی از رشته‌های پالیندروم با تعداد کاراکترهای زوج می‌توان به عبارت «Woow» اشاره کرد.

پسر جوانی در مقابل دیواری ایستاده که خطوط سیسم نورانی بر روی آن نصب شده‌اند.

۲. تحلیل مسئله و تجزیه آن به بخش‌های کوچک‌تر

مرحله بعدی در فرایند آموزش الگوریتم نویسی یاد دادن تحلیل صحیح مسئله و تجزیه آن به بخش‌های کوچک‌تر است. زیرا بررسی موشکافانه مسئله به درک پیچید‌گی‌های آن و شناسایی رویکرد‌های قابل استفاده در حل مسئله کمک می‌کند.

پیروی از الگوی زیر، روش خوبی برای تجزیه و تحلیل مسئله است.

  • شناسایی الگوها و رابطه‌ها: به دنبال الگو‌های تکرار شونده و شباهت‌های مسئله با مسائل شناخته شده بگردید.
  • مشخص کردن نوع مسئله: باید ببینید که آیا مسئله به کدام ساختار مشهور شبیه است. برای مثال به شباهت مسئله به آرایه‌ها، رشته‌ها، ساختارهای درختی، گراف‌ها، برنامه‌ریزی پویا و غیره توجه کنید.
  • شناسایی موارد خاص: در این بخش باید به سناریو‌های خاص فکر کنیم. برای مثال داده‌های ورودی خالی، عناصر تک‌کاراکتری یا توزیع‌های داده غیرمعمول می‌توانند چند مورد از استثناهای این مسئله باشند.
  • ارزیابی امکان‌پذیری حل مسئله: باید بررسی کنیم که آیا مسئله با توجه به محدودیت‌ها، منابع و زمان در دسترس، قابل حل است یا نه.

حل مسائل الگوریتمی، بخش مهمی از فرایند استخدام در شرکت‌های فناوری است. این مسائل نه تنها به ارزیابی مهارت‌های برنامه‌نویسی افراد می‌پردازند، بلکه توانایی آن‌ها را در تجزیه‌ و تحلیل مشکلات پیچیده و حل آن‌ مشکلات با استفاده از الگوریتم‌های بهینه نیز ارزیابی می‌کنند. در صورتی که بخواهید مهارت مورد نیاز برای رد شدن از چنین چالش‌هایی را بیاموزید، پیشنهاد می‌کنیم که فیلم آموزش رایگان حل مسائل الگوریتمی برای مصاحبه های برنامه نویسی همراه با یادگیری خلاقانه و مفید با جادی را از فرادرس مشاهده کنید. لینک مربوط به این فیلم را در پایین نیز قرار داده‌ایم.

ادامه حل مسئله بزرگترین زیررشته پالیندروم

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

  • الگوها: می‌دانیم که پالیندروم به کلمه‌هایی گفته می‌شود که از هر دو طرف به یک شکل خوانده می‌شوند.
  • نوع: مسئله مربوط به کار با رشته‌ها است. برای این نوع از مسائل می‌توان از روش‌هایی مانند «برنامه ریزی پویا» (Dynamic Programming) و «گسترش در اطراف مرکز» (Expand-Around-Center) استفاده کرد.
  • موارد استثانایی: در این بخش موارد استثنایی را شناسایی می‌کنیم. برای مثال می‌توان به رشته‌هایی با طول یک کاراکتر، رشته‌هایی با کاراکترهای یکسان و زیررشته‌های غیر پالیندرومی با طول بیش از یک کاراکتر اشاره کرد.
مغزی که ارتباطات بین نورون‌های آن مانند گراف به یکدیگر متصل شده است. - آموزش الگوریتم نویسی

روش آموزش الگوریتم نویسی در فرادرس چیست؟

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

مجموعه آموزش طراحی الگوریتم – درس، تمرین، حل مثال و تست
با کلیک بر روی تصویر بالا می‌توانید به صفحه اصلی مجموعه آموزش طراحی الگوریتم هدایت شوید.

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

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

۳. طراحی الگوریتم

در این قسمت از مطلب برای حل مسئله، باید استراتژی مناسبی را طراحی کنیم. استراتژی یا الگوریتم به صورت توالی منطقی از مراحل خل مسئله گفته می‌شود. با توجه به تحلیلی که از مسئله کرده‌ایم، این توالی باید آن را حل کند.

به منظور طراحی الگوریتم مناسب لازم است مراحل زیر را به صورت مرتب دنبال کنیم.

  • انتخاب ساختارهای داده درست: باید ساختارهای داده‌ای را انتخاب کنیم که بهترین هماهنگی را با نیازمندی‌های مسئله دارند. بسته به مسئله ممکن است از آرایه‌ها، جدول‌های هش، پشته‌ها یا غیره استفاده کنیم.
  • انتخاب یکی از رویکردهای الگوریتمی: رویکردهای الگوریتمی مختلفی مانند «بروت فورس» (Brute Force)، «تقسیم و حل» (Divide and Conquer)، برنامه ریزی پویا، «الگوریتم‌های حریصانه» (Greedy Algorithms)، «عقبگرد» (Backtracking) و غیره وجود دارند. با توجه به نتیجه تجزیه و تحلیل مسئله باید یکی از آن‌ها را انتخاب کنیم.
  • شرح مراحل الگوریتم: باید طرح سطح بالا یا شبه کدی ایجاد کنیم که جزئیات هر مرحله را به دقت نشان می‌دهد. برای نوشتن این شبه کد از قید و بند سینتکس زبان برنامه نویسی دوری می‌کنیم.
  • در نظر گرفتن کارآمدی: تلاش می‌کنیم با توجه به پیچیدگی‌های زمانی و فضایی، کارآمدترین روش حل مسئله را پیدا کنیم. در زمان انتخاب روش صحیح، لازم است که به محدودیت‌های شناسایی شده هم توجه کنیم.

مثالی از الگوریتم طراحی شده

یکی از کارآمدترین روش‌ها برای پیدا کردن طولانی‌ترین زیررشته پالیندرومی، استفاده از رویکرد «Expand-Around-Center» است. در این مطلب تصمیم گرفته‌ایم که سوال مطرح شده را با کمک این رویکرد حل کنیم.

  1. با فرض اینکه هر کاراکتر، ممکن است مرکز رشته پالیندرومی باشد، باید بر روی تمام کاراکتر درون رشته پیمایش کنیم.
  2. به هر کاراکتر که می‌رسیم باید آن را بررسی کنیم. بنابراین از روی تمام کاراکترها جست‌وجوی خود را به اطراف گسترش می‌دهیم. با این کار می‌توان هم رشته‌های پالیندروم‌ با طول زوج و هم رشته‌های پالیندروم با طول فرد را تشخیص داد.
  3. طولانی‌ترین زیررشته پالیندرومی کشف شده را ذخیره کنید.
  4. بعد از اینکه تمام کاراکترها را بررسی کردیم، طولانی‌ترین زیررشته پالیندروم شناسایی شده را به بیرون می‌برگردانیم.

برای کمک به درک بهتر الگوریتم در بخش بعدی رویکرد «Expand-Around-Center» را معرفی کرده‌ایم.

روش Expand-Around-Center چیست؟

ایده اصلی «Expand-Around-Center» رشته‌های پالیندروم را مانند کاراکترهای متقارنی در نظر می‌گیرد که لایه به لایه در اطراف یکدیگر قرار می‌گیرند. یعنی اینکه اگر لایه‌های بیرونی رشته پالیندروم را حذف کنیم، هنوز هم در داخل آن رشته پالیندروم کوچک‌تری وجود دارد. هر رشته پالیندروم دارای یک مرکز است. با گسترش جست‌وجو دراطراف این مرکز می‌توانیم زیررشته‌های پالیندروم را پیدا کنیم.

برای مثال در عبارت «never» کاراکتر «v» را به عنوان مرکز در نظر می‌گیریم. این کاراکتر به تنهایی پالیندروم است. سپس کاراکترهای دو طرف «v» را بررسی می‌کنیم. زیر رشته «eve» هم خودش پالیندروم است. دوباره کاراکترهای دو طرف زیر رشته «eve» را بررسی می‌کنیم. رشته «never» پالیندروم نیست.

۴. نوشتن شبه کد و رسم فلوچارت

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

لپتاپی که در مقابل آن گرافی با گره‌های نورانی به صورت شناور در فضا قرار گرفته است.

شبه کد الگوریتم کشف بزرگترین زیررشته پالیندروم چیست؟

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

  1. شروع
  2. اگر رشته s خالی است برو به خط ۳ در غیر این صورت برو به خط ۴.
  3. مقدار «»  برگردان سپس برو به خط ۲۰.
  4. متغیرهای start  و end  را با مقدار 0  مقداردهی کن.
  5. تابع ExpandAroundCenter(left, right) را برای شبیه‌سازی حالت «Expand-Around-Center» پیاده‌سازی می‌‌کنیم.
  6. اگر در رشته s شرایط left >= 0  و right < length  و s[left] == s[right]  برقرار بودند برو به خط ۷، در غیر این صورت برو به خط ۸.
  7. مقدار left  را برابر با left - 1  و مقدار right  را هم برابر با right + 1  قرار بده. سپس برو به خط ۶.
  8. وقتی شرط برقرار نبود مقدارهای left + 1  و right - 1  را به بیرون برگردان.
  9. از 0  تا مقدار طول s - 1  پیمایش کن. به ازای هر مقدار در این پیمایش دستور خط بعد را اجرا کند.
  10. دستور l1, r1 = ExpandAroundCenter(i, i)  برای شناسایی زیررشته‌های پالیندروم با طول فرد است.
  11. دستور l2, r2 = ExpandAroundCenter(i, i + 1)  برای شناسایی زیر رشته‌های پالیندروم با طول زوج است.
  12. اگر r1 - l1  بزرگتر از end - start  بود برو به خط ۱۳، در غیر این صورت برو به خط ۱۶.
  13. مقدار l1  را به start  تخصیص بده.
  14. مقدار r1  را به end  تخصیص بده.
  15. برو به خط ۱۹.
  16. اگر r2 - l2  بزرگ‌تر از end - start  بودند برو به خط ۱۷ در غیر این صورت برو به خط ۱۹.
  17. مقدار l2  را به start  تخصیص بده.
  18. مقدار r2  را به end  تخصیص بده.
  19. زیررشته‌ای از s را که از start  شروع شده به end  ختم می‌شود، برگردان.
  20. پایان

رسم فلوچارت برای تابع ExpandAroundCenter

فلوچارت شبه‌کد رسم نموداری است که ویژگی‌های شبه‌کد را با فلوچارت در یکجا جمع می‌کند. شبه‌کد به توصیف سطح بالایی از رفتار منطقی برنامه کامپیوتری یا الگوریتم طراحی شده گفته می‌شود. شبه‌کدها از ساختارهای منطقی زبان برنامه‌نویسی استفاده می‌کنند اما نزدیک به زبان انسان هستند. فلوچارت تمام این ساختار منطقی را با استفاده از اشکال استانداردی به یک نمودار توصیفی تبدیل می‌کند. در این نمودار می‌‌توان تمام رفتار برنامه مورد نظر را به دقت مشاهده کرد. در این بخش از مطلب، فلوچارت مربوط به رفتار تابع ExpandAroundCenter را پیاده‌سازی کرده‌ایم. این تابع در شبکه‌کد بالا از خط ۵ تا ۸ را شامل می‌شود.

رسم فلوچارت برای تابع ExpandAroundCenter
فلوچارت بالا روش کار تابع ExpandAroundCenter را برای تشخیص زیررشته پالیندروم ارائه می‌دهد.

۵. کدنویسی الگوریتم در زبان برنامه نویسی مورد نظر

بعد از آماده شدن شبه‌کد باید آن را به کد زبان برنامه نویسی مورد نظر خود ترجمه کنیم. مطمئن شوید که کدهای نوشته شده تمیز و خوانا بوده و به خوبی مستند‌سازی شوند.

در بخش پایین، کدهای الگوریتم «کشف بزرگ‌ترین زیر رشته پالیندروم» را با استفاده از شبه کد بالا نوشته‌ایم. برای نوشتن این کدها از زبان برنامه نویسی پایتون استفاده کردیم.

1def longest_palindromic_substring(s):
2    if not s:
3        return ""
4    
5    start, end = 0, 0
6    
7    def expand_around_center(left, right):
8        while left >= 0 and right < len(s) and s[left] == s[right]:
9            left -= 1
10            right += 1
11        return left + 1, right - 1
12    
13    for i in range(len(s)):
14        # Check for odd-length palindrome
15        l1, r1 = expand_around_center(i, i)
16        # Check for even-length palindrome
17        l2, r2 = expand_around_center(i, i + 1)
18        
19        # Update the longest palindrome found
20        if r1 - l1 > end - start:
21            start, end = l1, r1
22        if r2 - l2 > end - start:
23            start, end = l2, r2
24    
25    return s[start:end + 1]
26
27# Example usage:
28input_str = "babad"
29print(longest_palindromic_substring(input_str))  # Output: "bab" or "aba"
مشاهده کامل کدها

۶. آزمایش و تایید کیفیت کار الگوریتم

در این مرحله باید کدهای نوشته شده و الگوریتم خود را تست کنیم. برای آزمایش الگوریتم لازم است که از چندین سناریو مختلف و به ‌طور خاص، مقادیر استثنا استفاده شود.

تست کردن روش کار الگوریتم

در کدهای زیر چند مورد تست مختلف را بررسی کرده‌ایم.

1print(longest_palindromic_substring(""))            # Expected Output: ""
2print(longest_palindromic_substring("a"))           # Expected Output: "a"
3print(longest_palindromic_substring("aa"))          # Expected Output: "aa"
4print(longest_palindromic_substring("ab"))          # Expected Output: "a" or "b"
5print(longest_palindromic_substring("babad"))       # Expected Output: "bab" or "aba"
6print(longest_palindromic_substring("cbbd"))        # Expected Output: "bb"
7print(longest_palindromic_substring("aacabdkacaa")) # Expected Output: "aca"

برای اعتبار سنجی و تایید کیفیت کار الگوریتم موارد زیر را بررسی می‌کنیم.

  • صحت انجام کار: مطمئن شوید که تمام موارد تست، دقیقا همان نتیجه‌ای را برمی‌گردانند که از آن‌ها انتظار می‌رود.
  • موارد استثنایی: مطمئن شوید سناریو‌های حاوی مقدارهای خاص مانند رشته خالی یا رشته تک کاراکتری به خوبی مدیریت شوند.
  • کارآمدی: تایید کنید که الگوریتم در مقابل مقادیر ورودی بزرگ هم در زمان قابل قبول کار خود را انجام می‌دهد. یعنی اینکه افزایش اندازه ورودی باعث کاهش کیفیت کار الگوریتم نمی‌شود.
بازوی رباتیک در حال اجرای الگوریتم برای مرتب‌سازی بر اساس رنگ

۷. تحلیل و بهینه‌سازی الگوریتم

در این مرحله کارآمدی الگوریتم را ارزیابی می‌کنیم. سپس بر اساس نتایج بدست آمده روش‌هایی را برای ارتقاء کیفیت کار الگوریتم پیدا می‌کنیم.

  • پیچیدگی زمانی:‌ «پیچیدگی زمانی» (Time Complexity) تعیین می‌کند که زمان اجرای الگوریتم با توجه به اندازه داده ورودی چگونه تغییر می‌کند. برای مثال، مقدار پیچیدگی زمانی رویکرد حل مسئله «Expand-Around-Center» برابر با O(n2)O(n²) است.
  • پیچیدگی فضایی: «پیچیدگی فضایی» (Space Complexity) مقدار فضای استفاده شده در حافظه را ارزیابی می‌کند. برای مثال، مقدار پیچیدگی فضایی رویکرد حل مسئله «Expand-Around-Center» برابر با O(1)O(1) است.

بهینه‌سازی‌های احتمالی

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

  • استفاده از الگوریتم‌های جایگزین: برای مثال با هدف حل کردن مسئله کشف بزرگترین زیررشته پالیندروم می‌توانیم از الگوریتم «Manacher» استفاده کنیم. زیرا این الگوریتم، پیچیدگی زمانی کمتری - بخصوص در کار با رشته‌های بزرگ - دارد. پیچیدگی زمانی الگوریتم Manacher برابر با O(n)O(n) است. البته خود الگوریتم، پیچیدگی بیشتری دارد بنابراین پیاده‌سازی آن نیز مشکل‌تر است.
  • بهینه‌سازی کد: برای بهینه‌سازی کد می‌توان از تکنیک‌های دیگری استفاده کرد. به عنوان مثال می‌توان به ساده‌تر کردن حلقه‌ها، حذف محاسابت زائد و افزایش خوانایی کدها بدون کاهش دادن کیفیت کد اشاره کرد.

روش کار الگوریتم های مدرن چیست؟

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

در فهرست زیر، چند مورد از آن‌ها را مشاهده می‌کنید. بعضی از فیلم‌های آموزشی الگوریتم‌های مدرن به صورت کاملا رایگان عرضه شده‌اند.

در صورت تمایل به دیدن فیلم‌های بیشتر می‌توانید بر روی تصویر زیر کلیک کنید. مجموعه آموزش الگوریتم‌های فرادرس فیلم‌های بسیار متنوعی دارند که فقط چند مورد را در فهرست بالا معرفی کرده‌ایم.

مجموعه آموزش الگوریتم های بهینه سازی هوشمند – مقدماتی تا پیشرفته
با کلیک بر روی تصویر بالا می‌توانید به صفحه اصلی مجموعه آموزش الگوریتم های بهینه سازی هوشمند هدایت شوید.

۸. اصلاح و مستندسازی الگوریتم

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

1def longest_palindromic_substring(s):
2    """
3    Finds the longest palindromic substring in the given string.
4
5    Parameters:
6    s (str): The input string.
7
8    Returns:
9    str: The longest palindromic substring.
10    """
11    if not s:
12        return ""
13    
14    start, end = 0, 0
15    
16    def expand_around_center(left, right):
17        """
18        Expands around the given center and returns the bounds of the palindrome.
19
20        Parameters:
21        left (int): The left index to start expanding.
22        right (int): The right index to start expanding.
23
24        Returns:
25        tuple: The start and end indices of the palindrome.
26        """
27        while left >= 0 and right < len(s) and s[left] == s[right]:
28            left -= 1
29            right += 1
30        return left + 1, right - 1
31    
32    for i in range(len(s)):
33        # Check for odd-length palindromes
34        l1, r1 = expand_around_center(i, i)
35        # Check for even-length palindromes
36        l2, r2 = expand_around_center(i, i + 1)
37        
38        # Update the longest palindrome found so far
39        if r1 - l1 > end - start:
40            start, end = l1, r1
41        if r2 - l2 > end - start:
42            start, end = l2, r2
43    
44    return s[start:end + 1]
مشاهده کامل کدها

۹. تمرین و یادگیری مداوم

برای حرفه‌ای شدن در الگوریتم نویسی باید به صورت منظم تمرین کنیم. تعهد به یادگیری و تمرین برای تسلط بر طراحی الگوریتم ضروری هستند.

  • حل مسائل مختلف: از منابع مختلف در اینترنت می‌توانید مسائل جدیدی پیدا کرده و برای تمرین حل کنید.
  • یادگیری الگوهای رایج: لازم است که الگو‌هایی مانند «پنجره کشویی» (Sliding Window)، «دو اشاره‌گر» (Two Pointers)، بازگشتی، برنامه‌ریزی پویا و الگوریتم‌های حریصانه را درک کرده و به خوبی بر روی آن‌ها مسلط شوید.
  • یادگیری از دیگران: راه‌حل‌های دیگران را بازبینی کنید. به انجمن‌های کدنویسی بپیوندید و از افراد دیگر، نظرشان را درباره کدهای خود بپرسید. با این کار‌ها می‌توانید رویکردهای مختلف حل مسئله را ببینید.
  • شرکت در مسابقات کدنویسی: در مسابقات زمان‌بندی شده کدنویسی شرکت کنید. این کار باعث می‌شود که در فن حل مسئله، سریع‌تر و بهتر شوید، بخصوص وقتی که تحت فشار هستید.
مرحله نهم تمرین و یادگیری مداوم
مرحله نهم تمرین و یادگیری مداوم

۱۰. بررسی بازخورد‌ها و تکرار مجدد فرایند

پیشرفت زمانی روی می‌دهد که اشتباه‌ها و نقاط ضعف خود را بشناسیم. با این کار می‌توانیم روش‌های حل مسئله را بازبینی کنیم.

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

جمع‌بندی

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

  1. درک صحیح مسئله
  2. تحلیل مسئله و تجزیه آن به بخش‌های کوچک‌تر
  3. طراحی الگوریتم
  4. نوشتن شبه کد
  5. کدنویسی الگوریتم در زبان برنامه نویسی مورد نظر
  6. آزمایش و تایید کیفیت کار الگوریتم
  7. تحلیل و بهینه‌سازی الگوریتم
  8. اصلاح و مستندسازی الگوریتم
  9. تمرین و یادگیری مداوم
  10. بررسی بازخورد‌ها و تکرار مجدد فرایند

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

بر اساس رای ۰ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
Design GurusboardmixMedium
دانلود PDF مقاله
نظر شما چیست؟

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